2014-09-12 181 views
0

我得到這樣的結果,當我按位& -4227072和0x7fffff:位屏蔽混亂

0b1111111000000000000000

這些是兩個值的位表示我&「荷蘭國際集團:

-0b10000001000000000000000

0b11111111111111111111111

不應該&'他們在一起,而不是給這個?

0b10000001000000000000000

感謝。

回答

4
-4227072 == 0xFFBF8000 == 1111 1111 1011 1111 1000 0000 0000 

-4227072 & 0x7fffff應該是

0xFFBF8000 == 1111 1111 1011 1111 1000 0000 0000 0000 
& 0x7fffff == 0000 0000 0111 1111 1111 1111 1111 1111 
    ----------------------------------------------------- 
    0x003F8000 == 0000 0000 0011 1111 1000 0000 0000 0000 
2

負數表示爲它的內部2's complement計算機的存儲器中。您發佈的二進制表示是誤導性的。在2的補碼中,最高有效位(位k)的值爲-2 k-1。剩下的數字是正如你所期望的那樣。

假設你正在處理的32個有符號整數,我們有:

 
    1111 1111 1011 1111 1000 0000 0000 0000 = −422707210 
& 0000 0000 0111 1111 1111 1111 1111 1111 = 7fffff16 
———————————————————————————————————————————————————————————— 
    0000 0000 0011 1111 1000 0000 0000 0000 

這是你得到了什麼。

要驗證的第一行:

 
−1 × 231 = −214748364810 
1 × 230 = 107374182410 
1 × 229 = 53687091210 
1 × 228 = 26843545610 
1 × 227 = 13421772810 
1 × 226 =  6710886410 
1 × 225 =  3355443210 
1 × 224 =  1677721610 
1 × 223 =  838860810 
1 × 221 =  209715210 
1 × 220 =  104857610 
1 × 219 =  52428810 
1 × 218 =  26214410 
1 × 217 =  13107210 
1 × 216 =  6553610 
1 × 215 =  3276810 
—————————————————————————————— 
       −422707210 
1

0b10000001000000000000000是正確的 - 如果你的整數進行編碼符號 - 幅度。

這在一些早期或新穎的機器上是可行的。 Another answer很好地解釋瞭如何將負整數表示爲2的補碼數,然後結果如您所見:0b1111111000000000000000