簡體   English   中英

Java“ int i = byte1 | 0x0200”與“ int i = byte1”?

[英]Java “int i = byte1 | 0x0200” vs “int i = byte1”?

Wikipedia-Java中的Shifts頁面

在位和移位操作中,類型byte被隱式轉換為int 如果字節值是負數 ,則最高位是1,那么將使用1來填充int中的額外字節。 所以

 byte b1=-5; int i = b1 | 0x0200; 

將給出i == -5作為結果。

我了解0x0200等於0b0000 0010 0000 0000 但是在上面顯示的段落中0x0200的意義是什么?

我的意思是-b1 b1 | 0x0200 b1 | 0x0200將始終等於i (請參見下面的“ 我的測試 ”),然后在上面的段落中,為什么不簡單地將byte b1=-5; int i = b1寫入byte b1=-5; int i = b1 byte b1=-5; int i = b1嗎?

我的測試

public static void main(final String args[]) {
    final byte min_byte = Byte.MIN_VALUE; // -128
    final byte limit = 0; // according to the bolded words in the passage
    for (byte b = min_byte; b < limit; ++b) {
        final int i1 = b;
        final int i2 = b | 0x0200;
        if (i1 != i2) { // this never happens!
            System.out.println(b);
        }
    }
}

但是在上面顯示的段落中0x0200的意義是什么?

這樣做僅出於說明目的:值0x200在一個位置等於1的位置成1 這個想法是要表明結果不是0x000002FB ,而是實際為-5 ,即0xFFFFFFFB

我了解0x0200等於0b1111 1110 0000 0000

不,不是。 正確的值由

int i = 0x0200; // <-- decimal 512
System.out.println(Integer.toBinaryString(i));

哪個輸出

1000000000

如果我們檢查您的第二個價值,

byte b1 = -5;
System.out.println(Integer.toBinaryString(b1));

我們得到

11111111111111111111111111111011

排列兩個數字

11111111111111111111111111111011
00000000000000000000001000000000

它似乎很清楚,結果將是位值-5 (因為只有0-5也是00x0200 )。 為了確定意義,我們可以檢查

int i = 0x0200; // <-- Decimal 512
System.out.println("Dec: " + Integer.toBinaryString(i).length());

產量

Dec: 10

因此,給定的按位或將強制第十位為真。 在您的輸入字節中確實如此,但是如果您使用-十進制1535( 0b 101 1111 1111 ),那么您會得到,

System.out.println(1535 | 0x0200);

輸出是

2047

因為如果您對兩個數字進行按位或運算

01000000000
10111111111

你得到

11111111111

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM