2010-07-06 78 views

回答

36

這是按位否定。這意味着它會在數字的每一位執行二進制NOT運算符。例如:

int x = 15; // Binary: 00000000 00000000 00000000 00001111 
int y = ~x; // Binary: 11111111 11111111 11111111 11110000 

當加上&操作者它用於清除位。因此,在您的示例中,這意味着var2+7結果的最後3位設置爲零。

正如在評論中指出的,它也被用來表示析構函數,但在你的例子中不是這種情況。

+8

+1正確答案。 只是想指出'〜'也被用來命名析構函數。 – ereOn 2010-07-06 14:17:54

+1

並且通常用於形成位掩碼。 – 2010-07-06 14:18:34

+0

非常感謝。你很好地清除了我。 – Swiss 2010-07-06 14:26:32

2

7的二進制是00000111,所以〜7是11111000(假設是一個8位字節)。代碼作者正在使用它進行位掩碼。

+3

它可能不是位掩碼 - 它可能只是四捨五入到最近的8位(出於某種原因)。 – corsiKa 2010-07-06 14:19:04

+0

這不僅僅假設一個8位字節,而是一個1字節的'int',這對任何符合標準的C編譯器都是錯誤的假設。 – sepp2k 2010-07-06 14:19:56

+2

我想他只是想避免寫太多的二進制數字,並在同一時間通過示例解釋不操作。然而,非八位字節可能存在,所以他只是指定例子是在一個字節上做出的,並且該字節有8位。 – ShinTakezou 2010-07-06 14:25:14

3

這是一個按位不是。不要與邏輯不相混淆(這是!),它會翻轉邏輯值(true爲false,反之亦然)。該運算符翻轉變量中的每一位。

4

此代碼將var1舍入爲最接近的n * 8數字。 &〜7將最後3位設置爲0,舍入到8 * n。

1

如上所述,代碼的作用是將值四捨五入爲八的更高倍數。我的首選公式是「var1 =(var2 | 7)+1;」但要理解的表達作爲寫入,這是最有幫助的從外向內理解。

雖然「&」和「〜」是單獨的運營商,具有不同的優先級的規則,執行「的概念= B &〜Ç ;」是非常有用的一個,它在真正的意義上值得自己的操作符(它會允許更合理的整數提升規則等)。基本上,「a = b &〜c;」用來取消'b'中'c'中的任何位(如果'b'長且'c'不是,由於整數提升規則,它也取消了更高的位)。如果'c'是2^N-1,則表達式將抵消底部的N位,這相當於向下舍入到2^N的下一個倍數。

寫入的表達式在將結果舍入到8的下一個倍數之前將var2加7。如果var2是8的倍數,則加7將不會完全達到8的下一個更高倍數,否則它會。因此,整個表達式將四捨五入到8的下一個倍數。

順便說一下,我的首選公式將數字四捨五入到數字的下一個較高的值,該值剛好小於8的倍數,然後將其顛倒爲下一個倍數。它避免了重複的魔術數字「7」,並且在一些指令集中該方法將節省代碼。