我得到這樣的結果,當我按位& -4227072和0x7fffff:位屏蔽混亂
0b1111111000000000000000
這些是兩個值的位表示我&「荷蘭國際集團:
-0b10000001000000000000000
0b11111111111111111111111
不應該&'他們在一起,而不是給這個?
0b10000001000000000000000
感謝。
我得到這樣的結果,當我按位& -4227072和0x7fffff:位屏蔽混亂
0b1111111000000000000000
這些是兩個值的位表示我&「荷蘭國際集團:
-0b10000001000000000000000
0b11111111111111111111111
不應該&'他們在一起,而不是給這個?
0b10000001000000000000000
感謝。
-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'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 ✓
0b10000001000000000000000
是正確的 - 如果你的整數進行編碼符號 - 幅度。
這在一些早期或新穎的機器上是可行的。 Another answer很好地解釋瞭如何將負整數表示爲2的補碼數,然後結果如您所見:0b1111111000000000000000
。