[英]What does ~0 mean in this code?
這段代碼中〜0的含義是什么?
有人可以為我分析這段代碼嗎?
unsigned int Order(unsigned int maxPeriod = ~0) const
{
Point r = *this;
unsigned int n = 0;
while( r.x_ != 0 && r.y_ != 0 )
{
++n;
r += *this;
if ( n > maxPeriod ) break;
}
return n;
}
~0
是按位求補0
,這與填充所有位的數字。 對於無符號的32位int,即0xffffffff
。 f
s的確切數量取決於您指定的值的大小~0
。
它是一個補碼,它反轉所有位。
~ 0101 => 1010
~ 0000 => 1111
~ 1111 => 0000
正如其他人所提到的, ~
運算符執行按位補碼。 但是,對標志值執行操作的結果不是由標准定義的。
特別是, ~0
的值不必是-1
,這可能是預期的值。 將默認參數設置為
unsigned int maxPeriod = -1
將使maxPeriod
包含最高可能值(簽名到無符號轉換被定義為賦值模2**n
,其中n
是給定無符號類型的特征數(表示的位數))。
另請注意,默認參數在C中無效。
它是二進制補碼函數。
基本上它意味着翻轉每一位。
它是0的按位補碼,在這個例子中,它是一個int,所有位都設置為1.如果sizeof(int)是4,那么數字是0xffffffff。
基本上,它說maxPeriod的默認值為UINT_MAX。 作者不是將其寫成UINT_MAX,而是利用他對補語的知識來計算價值。
如果您希望將來的代碼更具可讀性,請加入
#include <limits>
並將調用更改為read
unsigned int Order(unsigned int maxPeriod = UINT_MAX) const
現在解釋為什么~0是UINT_MAX。 因為我們正在處理一個int,其中0表示所有零位(00000000)。 添加一個會給(00000001),再添加一個會給(00000010),還有一個會給(00000011)。 最后再添加一個(00000100)因為1的攜帶。
對於無符號整數,如果重復進程ad-infiniteum,最終你有一個位(11111111),並且添加另一個將溢出緩沖區設置所有位回零。 這意味着無符號數中的所有位都是數據類型(在您的情況下為int)可以容納的最大值。
“〜”操作將所有位從0翻轉為1或從1翻轉為0,翻轉零整數(具有全零位)有效地為您提供UINT_MAX。 所以他基本上以前編碼選擇了計算機UINT_MAX而不是使用位於#include <limits.h>
的系統定義副本
在該示例中,可能嘗試生成UINT_MAX值。 由於已經陳述的原因,該技術可能存在缺陷。
然而,該表達式確實有合法的用途來生成位掩碼,其中所有位都使用與字段寬度無關的文字常量設置; 但這不是你的例子中使用它的方式。
正如其他人所說,〜是按位補碼運算符(有時也稱為按位運算符)。 它是一元運算符,這意味着它只需要一個輸入。
按位運算符將輸入視為位模式,並對每個位執行各自的操作,然后返回結果模式。 將〜運算符應用於位模式將取消每個位(每個零變為1,每個變為零)。
在您給出的示例中,整數0的位表示全為零。 因此,~0將產生所有1的位模式。 即使0是int,也是分配給maxPeriod的位模式~0(不是由所述位模式表示的int值)。 由於maxPeriod是一個unsigned int,因此它被賦予了由~0(所有1的模式)表示的unsigned int值,這實際上是unsigned int在回繞到0之前可以存儲的最高值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.