C 查找数字二进制位置

C 查找数字二进制位置,c,C,我有一个8位整数,例如20(二进制-0000100)。我怎样才能找到这些数字在二进制表示中的位置呢?我可以用2的幂做一个,但是对于多个,我被卡住了,你必须做一个循环,然后依次检查每个1。如果您期望的结果是一个位置列表,那么您可以做得比线性复杂度更好,因为答案本身可能是线性的。您可以只测试循环中的每个位,例如 char val = 0x42; for (int i = 0; i < CHAR_BIT; ++i) printf("bit %d = %d\n", i, (val &am

我有一个8位整数,例如20(二进制-0000100)。我怎样才能找到这些数字在二进制表示中的位置呢?我可以用2的幂做一个,但是对于多个,我被卡住了,你必须做一个循环,然后依次检查每个1。如果您期望的结果是一个位置列表,那么您可以做得比线性复杂度更好,因为答案本身可能是线性的。

您可以只测试循环中的每个位,例如

char val = 0x42;

for (int i = 0; i < CHAR_BIT; ++i)
    printf("bit %d = %d\n", i, (val & (1 << i)) != 0);
char val=0x42;
对于(int i=0;ii)&1);
非常简单的解决方案:

int myNum = 123;
int isOne[32];
for(int ii=0; ii<32; ii++) {
  isOne[ii] = (myNum & 1)?1:0;
  myNum = myNum >> 1;
}  
int myNum=123;
int-isOne[32];
对于(int ii=0;ii>1;
}  

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

int oneBit = x & ~(x-1);
在此之后,
oneBit
将只设置
x
的最低位。
(例如,如果
x
0001 0100
,则一位为
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

这可能是一个非常简短的回答:

    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; 
}
职位:

    for(int i=0;x;x>>=1,i++)
       if(x&1)
          printf("Bit set at position %d\n", i);

您是否将此二进制数存储在数组中?您希望如何表示您的答案?使用一个数字数组?布尔值?您可以通过测试LSB,然后右移1并重复,轻松地将二进制数转换为布尔值数组。显示您的代码。这将帮助我们回答。
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);