2010-06-29 68 views
7

我想我可能在我的CS課中睡過頭時,他們談到位位置,所以我希望有人可以伸出援助之手。在一個無符號的32位整數中查找位的位置

我有一個無符號的32位整數(允許使用的值:28)

據一些資料我去了,整的值包含標誌指定各種事情。

標誌內的位位置從1(低位)到32(高位)編號。 所有未定義的標誌位都是保留的,必須設置爲0.

我有一個表格,顯示了標誌的含義,其含義爲1-10。

我希望有人能夠嘗試並向我解釋這一切意味着什麼,以及如何根據位位置從28等數字中找到「標誌」值。

感謝

回答

8

2取代

flags >>= 1; 

8以二進制轉換爲11100。這意味着位1和位2未置位,位3,4和5置位。

的幾點:第一,任何人誰是真正習慣於到C通常會從0開始編號,而不是1其次,你可以測試使用按位與運算符(&),個人標誌,如:

#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 
+0

傑裏的輕微變化,你對二進制值第一部分是有道理的,但是我有點CON融合了你發佈的代碼......你有什麼是flag1,flag2等物品呢?當我把你有什麼,我得到輸出4和8設置。不知道這是什麼意思,因爲上面我們說第3,4和5位被設置爲 – kdbdallas 2010-06-29 17:16:13

+0

@kdbdallas:我已經給代碼添加了一些註釋,希望能夠使標記的含義更加明顯。 – 2010-06-29 17:21:48

0

假設flags是無符號...

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

如果flags簽署你應該

flags = (flags >> 1) & 0x7fffffff; 
3

要獲得價值01代表剛剛從該整數,使用n個位的int

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

但這通常不是你想要做的。更常見的成語是這樣的:

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

在這種情況下bitN0如果n個位未設置,和非零,所述第n位被設置的情況下。 (具體來說,無論價值如何,只需設置n即可。)

8

而是通過每一個比特循環,你只能通過設置位,而不是循環,如果你期望位被稀疏設置可以更快:

假設位字段是(標量整數)可變字段。

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. 
} 

當位字段不限於單個數據類型的大小,但可能有一些任意大小時,工作得很好。在這種情況下,您可以一次提取32位(或任何您的寄存器大小)位,對0進行測試,然後轉到下一個單詞。

0

使用日誌功能,具有基座2在Python中,這將是這樣的:

import math 

position = math.log(value, 2) 

如果位置不是一個整數,則超過1位被設置爲1。

0

甲@ 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); 
} 
0
// 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); 
      } 
    } 
相關問題