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
00101011
Java 에서처럼 바이너리 리터럴을 작성할 수 없으므로 대신 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
'Development Tip' 카테고리의 다른 글
프로그램을 증명할 수없는 이유는 무엇입니까? (0) | 2020.12.09 |
---|---|
Django : 길이가 고정 된 CharField, 어떻게? (0) | 2020.12.09 |
로컬 네트워크의 다른 컴퓨터에서 webrick / rails에 액세스 (0) | 2020.12.09 |
모든 원격 연결 허용, MySQL (0) | 2020.12.09 |
C # WPF의 콤보 상자에서 선택한 값 가져 오기 (0) | 2020.12.09 |