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.
}
// 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);
}
}
// let arr[n] is an array of integers of size n.
int fq[33] = {0} // frequency array that will contain frequency of set bits at a particular position as 1 based indexing.
for(int i=0; i<n; i++) {
int x = arr[i];
int pos = 1; // bit position
for(int i=1; i<=pow(2,32); i= i<<1) { // i is the bit mask for checking every position and will go till 2^32 because x is an integer.
if(x & i) fq[pos]++;
pos++;
}
}
#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;
}
9条答案
按热度按时间vlf7wbxs1#
您可以只循环已设置的位,而不是循环每一位,如果您希望位被稀疏地设置,这样会更快:
假设位字段在(标量整数)变量字段中。
当位字段的大小不受单一数据类型的限制,而是可以是任意大小时,这种方法非常有效,在这种情况下,您可以一次提取32位(或任何寄存器大小),并针对0进行测试,然后继续处理下一个字。
envsm3lx2#
要获取值为
0
或1
的int
,其中0
或1
仅表示该整数的第n
位,请用途:但这通常不是你想做的,更常见的一个成语是:
在这种情况下,如果第
n
位未置位,则bitN
为0
,如果第n
位置位,则bitN
为非零值(具体地说,它将是仅第n
位置位后得出的任何值)。xe55xuns3#
假设
flags
是无符号的...如果
flags
有符号,则应将与
zf2sa74q4#
使用一个log函数,以2为基数,在python中如下所示:
如果位置不是整数,则超过1位被设置为1。
dauxcl2d5#
@invaliddata的回答略有不同-
2ledvvac6#
mtb9vblg7#
@boolAeon答案的MSVC变体
eyh26e7m8#
假设你有一个整数数组,你想找到所有的位置(32位位置),这些位置的位被设置在一起,也就是说,对于一个特定的位位置,通过考虑所有的整数,你总共会有多少个设置位。在这种情况下,你可以做的是检查每个整数,并标记其设置位位置:
x3naxklr9#
28转换为二进制的11100。这意味着位1和2未置位,而位3、4和5置位。
有几点:首先,任何真正熟悉C语言的人通常都会从0开始编号,而不是从1开始。其次,您可以使用按位AND运算符(
&
)测试各个标志,如下所示:等等。您还可以检查在循环中设置了哪些位:
应打印: