Development Tip

Java에서 비트 시프 팅은 어떻게 작동합니까?

yourdevel 2020. 12. 9. 21:54
반응형

Java에서 비트 시프 팅은 어떻게 작동합니까?


나는이 진술이있다 :

byte의 비트 값 x이 00101011 이라고 가정합니다 . 결과는 x>>2무엇입니까?

어떻게 프로그래밍하고 누군가가 무엇을하고 있는지 설명 할 수 있습니까?


첫째, Java에서 a 이동할 없으며byte an int또는 a 만 이동할 수 있습니다 long. 그래서 byte먼저 승진을하게됩니다.

00101011 -> 00000000000000000000000000101011

또는

11010100 -> 11111111111111111111111111010100

이제 x >> N의미합니다 (이진수 문자열로 보는 경우).

  • 맨 오른쪽 N 비트는 버려집니다.
  • 가장 왼쪽 비트는 결과를 원래 크기 (32 또는 64 비트)로 채우는 데 필요한만큼 복제됩니다. 예 :

00000000000000000000000000101011 >> 2 -> 00000000000000000000000000001010

11111111111111111111111111010100 >> 2 -> 11111111111111111111111111110101


시프트 연산자

에 대한 바이너리 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

오른쪽으로 2 비트 이동하면 2 개의 최하위 비트가 삭제됩니다. 그래서:

x = 00101011

x >> 2

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

이것은 본질적으로 int를 2, 2 배로 나누는 것과 같습니다.

자바에서

byte b = (byte) 16;
b = b >> 2;
// prints 4
System.out.println(b);

다음 예는 양수와 음수 모두에 적용되는 세 가지 유형의 이동을 다룹니다.

// 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

>>산술 오른쪽 시프트 연산자입니다. 첫 번째 피연산자의 모든 비트는 두 번째 피연산자가 나타내는 자리 수만큼 이동합니다. 결과의 가장 왼쪽 비트는 원래 숫자의 가장 왼쪽 비트와 동일한 값으로 설정됩니다. (음수는 음수로 유지됩니다.)

구체적인 사례는 다음과 같습니다.

00101011
  001010 <-- Shifted twice to the right (rightmost bits dropped)
00001010 <-- Leftmost bits filled with 0s (to match leftmost bit in original number)

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

byte x = 51; //00101011
byte y = (byte) (x >> 2); //00001010 aka Base(10) 10

00101011Java 에서처럼 바이너리 리터럴을 작성할 수 없으므로 대신 16 진수로 작성할 수 있습니다.

byte x = 0x2b;

결과를 계산하려면 x >> 2정확히 작성하고 결과를 인쇄하면됩니다.

System.out.println(x >> 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 링크 및 약간의 예제 추가


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이됩니다.

참고 URL : https://stackoverflow.com/questions/3312853/how-does-bitshifting-work-in-java

반응형