我想我可能在我的CS課中睡過頭時,他們談到位位置,所以我希望有人可以伸出援助之手。在一個無符號的32位整數中查找位的位置
我有一個無符號的32位整數(允許使用的值:28)
據一些資料我去了,整的值包含標誌指定各種事情。
標誌內的位位置從1(低位)到32(高位)編號。 所有未定義的標誌位都是保留的,必須設置爲0.
我有一個表格,顯示了標誌的含義,其含義爲1-10。
我希望有人能夠嘗試並向我解釋這一切意味着什麼,以及如何根據位位置從28等數字中找到「標誌」值。
感謝
我想我可能在我的CS課中睡過頭時,他們談到位位置,所以我希望有人可以伸出援助之手。在一個無符號的32位整數中查找位的位置
我有一個無符號的32位整數(允許使用的值:28)
據一些資料我去了,整的值包含標誌指定各種事情。
標誌內的位位置從1(低位)到32(高位)編號。 所有未定義的標誌位都是保留的,必須設置爲0.
我有一個表格,顯示了標誌的含義,其含義爲1-10。
我希望有人能夠嘗試並向我解釋這一切意味着什麼,以及如何根據位位置從28等數字中找到「標誌」值。
感謝
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
假設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;
要獲得價值0
或1
代表剛剛從該整數,使用n
個位的int
:
int bitN = (value >> n) & 1;
但這通常不是你想要做的。更常見的成語是這樣的:
int bitN = value & (1 << n);
在這種情況下bitN
將0
如果n
個位未設置,和非零,所述第n
位被設置的情況下。 (具體來說,無論價值如何,只需設置n
即可。)
而是通過每一個比特循環,你只能通過設置位,而不是循環,如果你期望位被稀疏設置可以更快:
假設位字段是(標量整數)可變字段。
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進行測試,然後轉到下一個單詞。
使用日誌功能,具有基座2在Python中,這將是這樣的:
import math
position = math.log(value, 2)
如果位置不是一個整數,則超過1位被設置爲1。
甲@ 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);
}
// 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);
}
}
傑裏的輕微變化,你對二進制值第一部分是有道理的,但是我有點CON融合了你發佈的代碼......你有什麼是flag1,flag2等物品呢?當我把你有什麼,我得到輸出4和8設置。不知道這是什麼意思,因爲上面我們說第3,4和5位被設置爲 – kdbdallas 2010-06-29 17:16:13
@kdbdallas:我已經給代碼添加了一些註釋,希望能夠使標記的含義更加明顯。 – 2010-06-29 17:21:48