簡體   English   中英

邏輯運算符與按位運算符的區別是什么

[英]What's the point of logical operators vs. bitwise operators

鑒於此聲明是合乎邏輯的操作

 ((a > 5) && (b > 4))

這句話是按位運算

   ((a > 5) & (b > 4)) 

以上兩個陳述並不等同。

因為(a > 5){0,1}的元素

那么,為什么我們需要logical operators & bitwise-operation呢?

編輯 :感謝您的所有反饋。 關於邏輯運算符的短路行為,我實際上不希望這種行為-我正在為GPU編寫代碼,其中分支降低了性能:短路導致兩個分支而不是代碼中的一個。

對於用C進行的數值比較,在不需要短路的情況下,似乎邏輯和按位具有相同的行為。 就我而言,按位運算比邏輯運算快。

對於沒有在原始帖子中添加這些詳細信息,我深表歉意。

我想不,以這個例子為例(0b-表示二進制):

a = 0b00000010
b = 0b00000100

現在, ab都不為0。但是a & b == 0 (由於按位與的定義方式)。

但是a && b != 0 (因為如果至少一個操作數為0,則邏輯AND結果為0-上面的ab則不是這種情況)。


也有短路的評價,如果&&左側的操作數是0,正確的將不進行評估,因為結果當然是0(例如,前面已經提到0 && x == 0的不管值x )。

  • 邏輯運算符在組合它們之前將其操作數轉換為bool ,邏輯運算符的結果始終都是bool 按位運算符不執行此操作(但是無論如何,對於布爾運算符,這兩種操作符之間沒有區別)。
  • 邏輯運算符可用於許多可轉換為bool的操作數類型,而按位運算符在特定情況下僅可用於少數類型,並且按位運算符的輸出是類型化的(並非始終為bool)。
  • 邏輯運算符是捷徑。 例如,對於&&這意味着:如果第一個操作數為false,則第二個操作數甚至都不會求值,因為無論第二個操作數的值如何,整個表達式(false && something)已經為false。

邏輯快捷方式運算符通常在以下情況下被利用:

// If mypointer is NULL, then mypointer->is_whatever()
// isn't evaluated so it doesn't cause a NULL pointer crash.
if (mypointer && mypointer->is_whatever()) {
    // do my thing
}

邏輯運算符將比較多個值的真實性。

例如,使用&&運算符查看兩個值是否均為true


按位運算符用於隔離和修改值中的位。

例如,要關閉一個8位值中的所有位(除了一位),您可以這樣做:

val & 00100000

在上面的示例中,第6位(從1開始)或第5位(從0開始)保持原樣,其他位關閉。


兩種類型的運算符都相似,它們都產生0或1。

例如,采取以下措施:

1 || 0

上述將產生1 ,因為任一值等於1 但是,如果將運算符切換為&& ,它將產生0。

在您嘗試的所有運算符中,它們都將給出10truefalse 那是因為兩者之間沒有關系:不存在諸如表達式的評估結果為“真”或“假”之類的東西。

我認為之所以逐位操作總是“產生” 1或0是非常自我解釋: -wise; 位是1或0。

並非所有用作布爾值的表達式的取值都為0或1; 當0被視為false時,除0以外的任何值都被視為true。 因此,例如,即使1和2都被認為是真實的, 1 && 2才是真實的,而1 & 2不是。

另外,正如其他人指出的那樣,如果第一個表達式足以確定總值(“短路”),則邏輯運算符將不會對第二個表達式求值,這顯然不能用按位形式完成(嗯,不是那么頻繁) ; 0 & ?將是0,無論?是什么,因此不需要對?進行求值即可得出最終值,但&不能那樣工作)。

暫無
暫無

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

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