[英]~ Unary Operator and Bitwise Tests Give Negative Results
我正在研究按位運算符,直到一元 ~one 的補碼與它們一起使用,它們才有意義。 誰能向我解釋這是如何工作的?
例如,這些是有意義的,但是除這些之外的計算的 rest 沒有:
1&~0 = 1 (~0 is 1 -> 1&1 = 1)
~0^~0 = 0 (~0 is 1 -> 1^1 = 0)
~1^0 = 1 (~1 is 0 -> 0^1 = 1)
~0&1 = 1 (~0 is 1 -> 1&1 = 1)
~0^~1 = 1 (~0 is 1, ~1 is 0 -> 1^0 = 1)
~1^~1 = 0 (~1 is 0 -> 0^0)
產生的結果的 rest 為負數(如果無符號,則為一個非常大的數字)或與我所知道的邏輯相矛盾。 例如:
0&~1 = 0 (~1 = 0 therefor 0&0 should equal 0 but they equal 1)
~0&~1 = -2
~1|~0 = -1
等等。你可以指點我了解這個嗎?
當您將它們擴展一點時,它們實際上確實有意義。 不過有幾點需要注意:
僅當涉及的兩個位都是 1 時,按位與才會產生 1。否則,它會產生 0。1 & 1 = 1、0 & 任何東西 = 0。
當 position 中的任何位為 1 時,按位 OR 產生 1,僅當 position 中的所有位為 0 時才產生 0。 1 | 0 = 1, 1 | 1 = 1, 0 | 0 = 0。
有符號數通常以二進制補碼的形式完成(盡管處理器不必這樣做。),請記住使用二進制補碼。 當最高位 position 為 1 時,您反轉並加 1 以獲得幅度。
假設是 32 位 integer,您會得到以下結果:
0 & ~1 = 0 & 0xFFFFFFFE = 0
~0 & ~1 = 0xFFFFFFFF & 0xFFFFFFFE = 0xFFFFFFFE (0x00000001 + 1) = -2
~1 | ~0 = 0xFFFFFFFE & 0xFFFFFFFF = 0xFFFFFFFF (0x00000000 + 1) = -1
~1 = 0
- 不,不是。 它等於-2
。 讓我們以一個八位二補碼為例。 十進制數1
具有表示0000 0001
。 所以~1
將有1111 1110
這是-2
的兩個補碼表示。
0&~1 = 0
(~1 = 0
因此0&0
應該等於0
但它們等於1
)
~1
等於-2
。 如果翻轉二進制補碼數的所有位,則將其乘以-1
並從結果中減去1
。 不管0
對於所有位都有0
,所以&
的結果無論如何都會是0
。
~0&~1 = -2
~0
已設置所有位,因此~0&~1
只是~1
。 這是-2
。
~1|~0 = -1
~0
已設置所有位,因此|
的結果是~0
(= -1
),無論它與什么進行或運算。
為簡單起見,只需擴展至 8 位,
1 = 0000 0001
你假設,
1 = 1111 1111 // which is wrong
1111 1111
,將是最大可能的數字。
如果您希望每個位都設置為1
,您需要執行以下操作:
(-1)
或者
~0
還要小心你使用的類型,比如你可能想做 64 位的操作,但它只能擴展到 32 位。 在這種情況下,您需要進行類型轉換。
例如:
uint64_t a = 1 << 63;
如果1
擴展為 32 位,則結果為 0,但您將其移動了 63。
因此,為了糾正這一點,
uint64_t a = 1ULL << 63;
或者
uint64_t a = (uint64_t)1 << 63;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.