ทำไม 11010100 << 1 เท่ากับ 110101000 ไม่ใช่ 10101000


40

ทำไมเมื่อฉันพยายามที่จะเปลี่ยนบิตสำหรับ 11010100 2ผลที่ได้คือ 110,101,000 2ไม่ 10101000 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เป็นเช่นเดียวกับ0b110101000และเป็น 424

  3. (byte)(0b11010100 << 1)จากนั้นคุณทิ้งให้ไบต์: บิตที่เกินจาก 8 อันดับแรกจะถูกตัดออกซึ่งจะเหลือ 0b10101000 ซึ่งคือ -88 ลบใช่เพราะในจาวาไบต์จะถูกลงนาม

  4. จากนั้นคุณก็จะทำการส่ง -88 กลับไปที่ int ในขณะที่คุณกำหนดให้เป็นค่า int มันยังคง -88 ซึ่งหมายความว่าบิตบนสุดทั้งหมด 1s

-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

หากคุณต้องการตั้งค่าเป็น 0 บิตทั้งหมดสูงกว่า 8 บิตด้านล่างคุณสามารถใช้บิตฉลาดและ:

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

เอาท์พุท:

10101000

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.