簡體   English   中英

這段代碼中~0是什么意思?

[英]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.

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