代码之家  ›  专栏  ›  技术社区  ›  kdbdallas

在无符号32位整数中查找位位置

  •  8
  • kdbdallas  · 技术社区  · 14 年前

    我想我可能在CS课上睡着了,当他们谈论比特位置的时候,所以我希望有人能帮我一把。

    我有一个无符号32位整数(让我们使用值:28)

    标志内的位位置从1(低位)到32(高位)进行编号。

    我有一个表格,显示了国旗的含义,数字的含义是1-10。

    我希望有人能试着向我解释这一切意味着什么,以及如何从一个像,28这样的数字中,根据位的位置找到“标志”值。

    谢谢

    7 回复  |  直到 9 年前
        1
  •  12
  •   Jerry Coffin    14 年前

    有几点:首先,任何真正习惯C的人通常会从0开始编号,而不是1。其次,你可以用按位and运算符测试各个标志( &

    #define flag1 1    //  1 = 00 0001
    #define flag2 2    //  2 = 00 0010
    #define flag3 4    //  4 = 00 0100
    #define flag4 8    //  8 = 00 1000
    #define flag5 16   // 16 = 01 0000
    #define flag6 32   // 32 = 10 0000
    
    if (myvalue & flag1)
        // flag1 was set
    
    if (myvalue & flag4)
        // flag4 was set
    

    等等。您还可以检查循环中设置了哪些位:

    #include <stdio.h>
    
    int main() { 
        int myvalue = 28;
        int i, iter;
    
        for (i=1, iter=1; i<256; i<<=1, iter++)
            if (myvalue & i)
                printf("Flag: %d set\n", iter);
        return 0;
    }
    

    Flag: 3 set
    Flag: 4 set
    Flag: 5 set
    
        2
  •  10
  •   invaliddata    13 年前

    您可以只循环设置的位,而不是循环每一个位,如果您希望位的设置稀疏,则循环速度会更快:

    while (field){
      temp = field & -field;  //extract least significant bit on a 2s complement machine
      field ^= temp;  // toggle the bit off
      //now you could have a switch statement or bunch of conditionals to test temp
      //or get the index of the bit and index into a jump table, etc.
    }
    

        3
  •  3
  •   JSBÕ±Õ¸Õ£Õ¹    14 年前

    得到一个 int 0 1 只代表 n

    int bitN = (value >> n) & 1;
    

    但这通常不是你想做的。一个更常见的成语是:

    int bitN = value & (1 << n);
    

    在这种情况下 bitN 0 如果 n n 位已设置(具体来说,它将是任何价值出来的只是 n 第位设置。)

        4
  •  0
  •   Doug Currie    14 年前

    flags 未签名。。。

    int flag_num = 1;
    while (flags != 0)
    {
        if ((flags&1) != 0)
        {
            printf("Flag %d set\n", flags);
        }
        flags >>= 1;
        flag_num += 1;
    }
    

    你应该替换

    flags >>= 1;
    

    flags = (flags >> 1) & 0x7fffffff;
    
        5
  •  0
  •   Pratik Bhat    10 年前

    在python中,使用一个以2为基数的log函数,如下所示:

    import math 
    
    position = math.log(value, 2)
    

        6
  •  0
  •   boolAeon    9 年前

    @invaliddata的答案略有变化-

    unsigned int tmp_bitmap = x;        
    while (tmp_bitmap > 0) {
        int next_psn = __builtin_ffs(tmp_bitmap) - 1;
        tmp_bitmap &= (tmp_bitmap-1);
        printf("Flag: %d set\n", next_psn);
    }
    
        7
  •  0
  •   Chandrakant Agarkar    8 年前
    // You can check the bit set positions of 32 bit integer.
    // That's why the check is added "i != 0 && i <= val" to iterate till 
    // the end bit position.
        void find_bit_pos(unsigned int val) {
                unsigned int i;
                int bit_pos;
                printf("%u::\n", val);
                for(i = 1, bit_pos = 1; i != 0 && i <= val; i <<= 1, bit_pos++) { 
                        if(val & i)
                                printf("set bit pos: %d\n", bit_pos);
                }
        }