11010100 << 1이 10101000이 아닌 110101000과 같은 이유는 무엇입니까?


40

11010100 2에 대해 비트를 이동하려고 하면 결과가 10101000 2 가 아니라 110101000 2 가 됩니다.

int a = Integer.parseInt("11010100", 2) << 1;

나는 이것을하려고합니다.

int a = (byte)(Integer.parseInt("11010100", 2) << 1);

그러나 출력 값이 128보다 크면 모든 것이 마이너스가되어 논리적입니다. 비트 수를 변경하지 않으려면 어떻게해야합니까?


4
정수 산술은 항상 ints 또는 longs 에서 수행됩니다 .
Tom Hawtin-tackline

34
32 비트 길이의 정수를 사용하고 있습니다. 결과가 8 비트로 잘릴 것으로 예상되는 이유는 무엇입니까?
jhamon

1
바이트 a = ...가 해결됩니다.
Perdi Estaquel

답변:


61

한 번에 한 걸음 씩 갑시다.

  1. Integer.parseInt("11010100", 2)-이것은 int 값 212입니다. 이것은 불필요한 것입니다. 당신은 쓸 수 있습니다 : 0b11010100.

  2. 0b11010100 << 1와 동일하며 0b110101000424입니다.

  3. 그런 다음 바이트로 캐스트하십시오 (byte)(0b11010100 << 1). 처음 8을 넘어선 비트는 모두 제거되어 0b10101000 (-88)을 남깁니다. 마이너스, 예. Java 바이트로 서명되었으므로.

  4. 그런 다음 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


19
그는에 값을 저장하고 int a있으므로 님이 있으면 & 0xFF전혀 캐스팅 할 필요가 없습니다. int a = (0b11010100<< 1) & 0xFF;
Mooing Duck

9

하위 8 비트보다 높은 모든 비트를 0으로 설정하려면 비트 AND를 사용할 수 있습니다.

int a = (Integer.parseInt("11010100", 2) << 1) & 0xff;
System.out.println (Integer.toString(a,2));

산출:

10101000

6

다음과 같이 해보십시오 :

int anInt = Integer.parseInt("11010100", 2) << 1;
int asUnsignedInt= Byte.toUnsignedInt((byte) anInt);

toUnsignedInt 가 Java SE 8에 도입되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.