簡體   English   中英

適用於uint64和uint32的循環不適用於uint8或uint16

[英]A loop that works for uint64 and uint32 doesn't work for uint8 or uint16

我想出了一個使用按位運算的循環,從而得到一個數字,該數字每隔一位打開一次(例如,對於8位01010101)。

從理論上講,我的循環應該可以正常工作,並且可以與uint32uint64一起正常工作,但不能與uint8uint16 我想知道為什么...

這是代碼:

@autoreleasepool {
    // a = 00000000
    uint32 a = 0;
    // b = 11111111
    uint32 b = ~a;
    // a = 11111111
    a = ~a;

    // if (a = 01010101) ~a = 10101010, a << 1 = 10101010
    while (~a != (a << 1)) {
        // 1st time: a << 1 = 11111110 = a
        // 2nd time: a << 1 = 11111010 = a
        a = a << 1;
        // 1st time: ~a = 00000001 = a
        // 2nd time: ~a = 00000101 = a
        a = ~a;
        // 1st time: a << 1 = 00000010 = a
        // 2nd time: a << 1 = 00001010 = a
        a = a << 1;
        // 1st time: b ^ a = 11111101 = a
        // 2nd time: b ^ a = 11110101 = a
        a = b ^ a;
    }

    NSLog(@"%x", a);
    NSLog(@"%u", b);



    // Apply the same loop to a bigger scale
    uint64 x = 0x0;
    uint64 y = ~x;
    x = ~x;

    while (~x != (x << 1)) {
        x = x << 1;
        x = ~x;
        x = x << 1;
        x = y ^ x;
    }

    NSLog(@"%llx", x);
    NSLog(@"%llu", x);
}
return 0;

“小於int”由 starblue表示sizeof(a) < sizeof(int) 由於整數提升規則 ,比int窄的類型總是在執行操作前提升為int。 有關更多信息,請參閱隱式類型提升規則

其結果是,如果是uint8uint16頂部位~a將始終是1,也決不能等於a << 1

例如,如果a是uint16 ,則運行幾次迭代,我們得到a = 0x5555。 在那之后

(int)a = 0x00005555
    ~a = 0xFFFFAAAA
a << 1 = 0x0000AAAA

如您所見, ~a != (a << 1) ,程序將永遠循環

暫無
暫無

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

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