我有一个8位整数,例如20(二进制 - 00010100)。我怎样才能找到数字二进制表示中位置的位置?我可以用一个2的幂来做它,但对于多个我的卡住
答案 0 :(得分:1)
您可以在循环中测试每个位,例如
char val = 0x42;
for (int i = 0; i < CHAR_BIT; ++i)
printf("bit %d = %d\n", i, (val & (1 << i)) != 0);
或者可能更简洁:
for (int i = 0; i < CHAR_BIT; ++i)
printf("bit %d = %d\n", i, (val >> i) & 1);
答案 1 :(得分:1)
要查找快速设置的位,请使用:
int oneBit = x & ~(x-1);
在此之后,oneBit
只会设置x
的最低位
(例如,如果x
为0001 0100
,则oneBit为0000 0100
)
之后,您可以使用以下方法关闭最低位:
x &= x-1;
(如果x
为0001 0100
,则新x
应为0001 0000
)
然后你可以重复第一个操作来找到设置的下一个最低位。
这可以直接找到那些设置的位,并跳过零位。
以下示例代码显示了它的实际效果:
int main(void)
{
int x = 20; // 0001 0100
while (x)
{
printf("Low Bit is: %d\n", x & ~(x-1));
x &= (x-1);
}
}
<强>输出:强>
Low Bit is: 4 // eg. 0000 0100
Low Bit is: 16 // eg. 0001 0000
答案 2 :(得分:0)
您必须进行一个循环并依次检查每个1。如果你期望的结果是一个位置列表,你可以不比线性复杂度更好,因为答案可能是线性的。
答案 3 :(得分:0)
非常简单的解决方案:
int myNum = 123;
int isOne[32];
for(int ii=0; ii<32; ii++) {
isOne[ii] = (myNum & 1)?1:0;
myNum = myNum >> 1;
}
答案 4 :(得分:0)
这可能是一个很简短的答案:
for(int i=0;x;x>>=1)
printf("Bit %d is: %d\n", i++, x & 1);
所以对于这段代码
#include <stdio.h>
int main(void)
{
int x = 20; // 0001 0100
for(int i=0;x;x>>=1)
printf("Bit %d is: %d\n", i++, x & 1);
return 0;
}
Bit 0 is: 0
Bit 1 is: 0
Bit 2 is: 1
Bit 3 is: 0
Bit 4 is: 1
职位:
for(int i=0;x;x>>=1,i++)
if(x&1)
printf("Bit set at position %d\n", i);