簡體   English   中英

按位不是邏輯明智不是:為什么~true == true和~false == false

[英]Bitwise not and Logic wise not: Why ~true == true and ~false == false

我有一個關於bitwise not logical not的問題,希望有人能為我解答。

所以我知道以下工作:

!true == false
!false == true

我認為bitwise not做同樣的事情,但顯然不能。

假設我有一個布爾值:

bool test = true;

然后當我打印~test ,輸出為true

如果布爾值是

bool test = false;

然后當我打印出~test ,輸出為true ,這是預期的。 但是,當我再次進行~test時,它不會再回到false

由於某種原因, bitwise not將布爾值從true翻轉為false

有沒有人有這個答案?

根據C ++標准的§5.3.1.10[expr.unary.op] ), ~運算符采用整數(或無范圍的枚舉類型)操作數並執行整數提升,其中~操作的結果類型是類型其推廣的操作數。 這意味着首先將布爾值轉換為整數( 0表示false1表示true )。 因為你的背景下,該結果~操作,再轉換回一個布爾值: false0 ,並true為所有非零值。

如果你有一個布爾值x ,你可以將~x視為~static_cast<int>(x) ,將x = ~x視為x = ((~static_cast<int>(x)) != 0)

因此:

bool a = false;
bool b = ~a; // b = (~static_cast<int>(a) != 0)
             // b = (~static_cast<int>(false) != 0)
             // b = (~0 != 0)
             // b = (0xffffffff != 0)
             // b = true
bool c = ~b; // c = (~static_cast<int>(b) != 0)
             // c = (~static_cast<int>(true) != 0)
             // c = (~1 != 0)
             // c = (0xfffffffe != 0)
             // c = true

理解正在發生的事情的關鍵是要意識到存在隱含的轉換 ~運算符應用於整數並返回一個整數,因此必須首先將操作數轉換為整數,然后在賦值之前將結果轉換為bool。 false轉換為0, true轉換為1.在另一個方向,0轉換為false任何非零值轉換為true ~1不為零,因此將其轉換為true

在對bool應用operator_之前,將轉換為int。 因此~true是~int(true),它不是零。

bool轉換為int

true ==> 1
false ==> 0

int轉換為bool

zero value ==> false
non-zero value ==> true

從這里開始,您的問題的答案很簡單:

~true == ~1
~1 != 0
~1 == true

你的期望~true == false將工作當且僅當true轉化為~0

~true == ~~0
~~0 == 0
0 == false

true轉換為0x00000001。 ~做按位否定,翻轉它所應用的值中的每一位。 ~0x00000001 == 0xfffffffe ,非0,因此計算結果為true。 類似地, false轉到0x00000000,並且~0x00000000 == 0xffffffff ,轉換為bool變為true。 當〜再次應用於該值時,該真值將轉換回0x00000001,而不是0xffffffff,並且您回到開頭。

暫無
暫無

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

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