[英]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
表示false
, 1
表示true
)。 因為你的背景下,該結果~
操作,再轉換回一個布爾值: false
為0
,並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.