2

I have an 8 bit integer for, example 20 (binary - 00010100). How could I go about finding the position of the ones in the number's binary representation? I could do it for a single one using powers of 2 but for multiple one's i'm stuck

4

5 回答 5

1

要找到快速设置的位,请使用以下命令:

int oneBit = x & ~(x-1);

在此之后,oneBit将只设置最低位x
(例如,如果x0001 0100,oneBit 将是0000 0100

之后,您可以使用以下命令关闭最低位:

x &= x-1;

(如果x0001 0100x应该是新的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
于 2013-09-18T12:54:09.783 回答
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);
于 2013-09-18T12:44:34.083 回答
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);
于 2013-09-18T13:17:25.657 回答
0

非常简单的解决方案:

int myNum = 123;
int isOne[32];
for(int ii=0; ii<32; ii++) {
  isOne[ii] = (myNum & 1)?1:0;
  myNum = myNum >> 1;
}  
于 2013-09-18T12:46:11.547 回答
0

您将不得不执行一个循环并依次检查每个 1。如果您期望的结果是一个职位列表,那么您可以比线性复杂性更好,因为答案本身可能是线性的。

于 2013-09-18T12:44:31.747 回答