63

私はこの声明を持っています:

バイトのビット値xが00101011であると仮定します。結果はx>>2何ですか?

どうすればそれをプログラムでき、誰かが私に何をしているのか説明できますか?

4

10 に答える 10

105

まず、 Javaではaをシフトできません。シフトできるのは、またはaだけです。したがって、最初にプロモーションが行われます。byteintlongbyte

00101011->00000000000000000000000000101011

また

11010100->11111111111111111111111111010100

さて、x >> N意味します(2進数の文字列として表示する場合):

  • 右端のNビットは破棄されます
  • 左端のビットは、結果を元のサイズ(32ビットまたは64ビット)にパディングするために必要な回数だけ複製されます。

00000000000000000000000000101011 >> 2->00000000000000000000000000001010

11111111111111111111111111010100 >> 2->11111111111111111111111111110101

于 2010-07-22T20:01:02.950 に答える
62

シフト演算子

のバイナリ32ビット00101011

00000000 00000000 00000000 00101011、結果は次のとおりです。

  00000000 00000000 00000000 00101011   >> 2(times)
 \\                                 \\
  00000000 00000000 00000000 00001010

43のビットを距離2だけ右にシフトします。左側の最高(符号)ビットで埋めます。

結果は、10進値10の00001010です。

00001010
    8+2 = 10
于 2013-12-04T07:57:54.640 に答える
15

右に2ビットシフトすると、最下位2ビットが削除されます。それで:

x = 00101011

x >> 2

// now (notice the 2 new 0's on the left of the byte)
x = 00001010

これは、intを2、2で割るのと本質的に同じです。

Javaの場合

byte b = (byte) 16;
b = b >> 2;
// prints 4
System.out.println(b);
于 2010-07-22T19:57:57.850 に答える
11

これらの例は、正の数と負の数の両方に適用される3つのタイプのシフトをカバーしています。

// Signed left shift on 626348975
00100101010101010101001110101111 is   626348975
01001010101010101010011101011110 is  1252697950 after << 1
10010101010101010100111010111100 is -1789571396 after << 2
00101010101010101001110101111000 is   715824504 after << 3

// Signed left shift on -552270512
11011111000101010000010101010000 is  -552270512
10111110001010100000101010100000 is -1104541024 after << 1
01111100010101000001010101000000 is  2085885248 after << 2
11111000101010000010101010000000 is  -123196800 after << 3


// Signed right shift on 626348975
00100101010101010101001110101111 is   626348975
00010010101010101010100111010111 is   313174487 after >> 1
00001001010101010101010011101011 is   156587243 after >> 2
00000100101010101010101001110101 is    78293621 after >> 3

// Signed right shift on -552270512
11011111000101010000010101010000 is  -552270512
11101111100010101000001010101000 is  -276135256 after >> 1
11110111110001010100000101010100 is  -138067628 after >> 2
11111011111000101010000010101010 is   -69033814 after >> 3


// Unsigned right shift on 626348975
00100101010101010101001110101111 is   626348975
00010010101010101010100111010111 is   313174487 after >>> 1
00001001010101010101010011101011 is   156587243 after >>> 2
00000100101010101010101001110101 is    78293621 after >>> 3

// Unsigned right shift on -552270512
11011111000101010000010101010000 is  -552270512
01101111100010101000001010101000 is  1871348392 after >>> 1
00110111110001010100000101010100 is   935674196 after >>> 2
00011011111000101010000010101010 is   467837098 after >>> 3
于 2015-01-24T05:23:28.773 に答える
5

>>算術右シフト演算子です。第1オペランドのすべてのビットは、第2オペランドで示される桁数だけシフトされます。結果の左端のビットは、元の数値の左端のビットと同じ値に設定されます。(これは、負の数が負のままになるようにするためです。)

これがあなたの特定のケースです:

00101011
  001010 <-- Shifted twice to the right (rightmost bits dropped)
00001010 <-- Leftmost bits filled with 0s (to match leftmost bit in original number)
于 2010-07-22T19:59:52.827 に答える
4
public class Shift {
 public static void main(String[] args) {
  Byte b = Byte.parseByte("00101011",2);
  System.out.println(b);
  byte val = b.byteValue();
  Byte shifted = new Byte((byte) (val >> 2));
  System.out.println(shifted);

  // often overloked  are the methods of Integer

  int i = Integer.parseInt("00101011",2);
  System.out.println( Integer.toBinaryString(i));
  i >>= 2;
  System.out.println( Integer.toBinaryString(i));
 }
}

出力:

43
10
101011
1010
于 2010-07-22T20:27:29.360 に答える
2

数値のbitStringプレゼンテーションを表示したい場合は、たとえばこのAPIを使用できます。アンコモンズ数学

例(jruby)

bitString = org.uncommons.maths.binary.BitString.new(java.math.BigInteger.new("12").toString(2))
bitString.setBit(1, true)
bitString.toNumber => 14

編集:APIリンクを変更し、少し例を追加します

于 2010-07-22T20:31:20.563 に答える
2

00101011Javaのようにバイナリリテラルを記述できないため、代わりに16進数で記述できます。

byte x = 0x2b;

結果を計算するには、x >> 2それを正確に記述して結果を印刷します。

System.out.println(x >> 2);
于 2010-07-22T19:58:00.673 に答える
2
byte x = 51; //00101011
byte y = (byte) (x >> 2); //00001010 aka Base(10) 10
于 2010-07-22T20:04:10.130 に答える
0

00101011=10進数で43

class test {    
    public static void main(String[] args){
       int a= 43;       
       String b= Integer.toBinaryString(a >> 2);        
       System.out.println(b);
    }   
}

出力:

101011は1010になります

于 2016-09-06T19:27:00.570 に答える