簡體   English   中英

~ 一元運算符和按位測試給出否定結果

[英]~ 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 時,按位與才會產生 1。否則,它會產生 0。1 & 1 = 1、0 & 任何東西 = 0。

  2. 當 position 中的任何位為 1 時,按位 OR 產生 1,僅當 position 中的所有位為 0 時才產生 0。 1 | 0 = 1, 1 | 1 = 1, 0 | 0 = 0。

  3. 有符號數通常以二進制補碼的形式完成(盡管處理器不必這樣做。),請記住使用二進制補碼。 當最高位 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.

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