11010100 2에 대해 비트를 이동하려고 하면 결과가 10101000 2 가 아니라 110101000 2 가 됩니다.
int a = Integer.parseInt("11010100", 2) << 1;
나는 이것을하려고합니다.
int a = (byte)(Integer.parseInt("11010100", 2) << 1);
그러나 출력 값이 128보다 크면 모든 것이 마이너스가되어 논리적입니다. 비트 수를 변경하지 않으려면 어떻게해야합니까?
답변
한 번에 한 걸음 씩 갑시다.
-
Integer.parseInt("11010100", 2)
-이것은 int 값 212입니다. 이것은 불필요한 것입니다. 당신은 쓸 수 있습니다 :0b11010100
. -
0b11010100 << 1
와 동일하며0b110101000
424입니다. -
그런 다음 바이트로 캐스트하십시오
(byte)(0b11010100 << 1)
. 처음 8을 넘어선 비트는 모두 제거되어 0b10101000 (-88)을 남깁니다. 마이너스, 예. Java 바이트로 서명되었으므로. -
그런 다음 int 값에 할당 할 때이 -88을 자동으로 int로 캐스트합니다. -88로 유지되며 모든 최상위 비트가 모두 1임을 의미합니다.
따라서 최종 값은 -88
입니다.
168
대신 (정확히 동일한 비트이지만 부호있는 대신 부호없는 것으로 표시됨) 을보고 싶다면 일반적인 트릭을 사용 & 0xFF
하여 처음 8을 제외한 모든 비트를 0으로 설정하여 양수를 보장합니다.
byte b = (byte) (0b11010100 << 1);
System.out.println(b); // -88. It is not possible to print 168 when printing a byte.
int asUnsigned = b & 0xFF;
System.out.println(asUnsigned); // 168.
// or in one go:
System.out.println(((byte) (0b11010100 << 1)) & 0xFF); // 168
답변
하위 8 비트보다 높은 모든 비트를 0으로 설정하려면 비트 AND를 사용할 수 있습니다.
int a = (Integer.parseInt("11010100", 2) << 1) & 0xff;
System.out.println (Integer.toString(a,2));
산출:
10101000
답변
다음과 같이 해보십시오 :
int anInt = Integer.parseInt("11010100", 2) << 1;
int asUnsignedInt= Byte.toUnsignedInt((byte) anInt);
toUnsignedInt 가 Java SE 8에 도입되었습니다.