如何循环遍历二进制数的每一位数字?

4

我有一个二进制数1011011,如何逐个循环遍历这些二进制位?

我知道如何对十进制整数进行此操作,方法是使用取模运算和除法。


你想要什么?将二进制转换为十进制。 - Javed Akram
9个回答

6
int n = 0x5b; // 1011011

实际上,你应该使用十六进制表示法,因为它通常更好。

printf("%x", n); // this prints "5b"

要将其转换为二进制(着重于易理解),可以尝试以下内容:
printf("%s", "0b"); // common prefix to denote that binary follows
bool leading = true; // we're processing leading zeroes
// starting with the most significant bit to the least
for (int i = sizeof(n) * CHAR_BIT - 1; i >= 0; --i) {
    int bit = (n >> i) & 1;
    leading |= bit; // if the bit is 1, we are no longer reading leading zeroes
    if (!leading)
        printf("%d", bit);
}
if (leading) // all zero, so just print 0
    printf("0");

// at this point, for n = 0x5b, we'll have printed 0b1011011

提前注意:如果您要构建此代码,则需要包括limits.h、stdbool.h(需要C99)和stdio.h。如果出于任何原因这些不可用,请告诉我,我会修改代码以符合您的系统。 - Matt Joiner
1
请注意,您可以只使用printf("0b"),无需使用%s和字符串参数。 - Nathan S.

3

在处理二进制数时,你可以像处理十进制数一样使用模运算和除法。你也可以使用二进制运算符,但如果你已经知道如何在十进制中使用它们,那么使用除法和模运算会更容易。


谢谢,我刚刚意识到我可以用模运算和除以2来实现。 - Attilah
@Attilah,实际上你可以在任何进制下做到这一点,甚至是16进制(但你需要手动将10替换为A等等) :) - Gabi Purcaru

3
扩展Frédéric和Gabi的答案,你只需要意识到在二进制中的规则与十进制中的规则是一样的-你只需要使用除数2进行除法和取模运算,而不是使用除数10。
下一步是简单地使用number >> 1代替number / 2number & 0x1代替number % 2以提高性能。请注意,使用现代优化编译器可能没有区别...

如果number是有符号的,则会有所不同。编译器必须花费额外的精力来满足C对除法的无能定义((-3)/2==-1,而不是应该是-2)。当然,在许多情况下,您应该通过使用无符号类型来修复这个问题,而不是采用按位操作,但是如果您的值真的是有符号的,并且当number为-3时想要 number%2产生-2,那么number&1就是正确的方法。请记住,负数的位移操作未被很好地定义。 - R.. GitHub STOP HELPING ICE
没错!好主意……我在位操作时有一种以无符号方式考虑的坏习惯。 - Mac

2
在C语言中,你至少可以这样做:
while (val != 0)
{
   printf("%d", val&0x1);
   val = val>>1;
}

2

为了进一步说明@Marco的答案,以下是一个示例:

uint value = 0x82fa9281;

for (int i = 0; i < 32; i++)
{
    bool set = (value & 0x1) != 0;
    value >>= 1;

    Console.WriteLine("Bit set: {0}", set);
}

这个操作会测试最后一位,然后将所有位向左移动一位。


2
使用带有递增2的幂的AND...

1
如果您已经有一个字符串,您可以通过迭代字符串中的每个字符来实现:
var values = "1011011".Reverse().ToCharArray();
for(var index = 0; index < values.Length; index++) {
 var isSet = (Boolean)Int32.Parse(values[index]); // Boolean.Parse only works on "true"/"false", not 0/1
 // do whatever
}

1
        byte input = Convert.ToByte("1011011", 2);
        BitArray arr = new BitArray(new[] { input });
        foreach (bool value in arr)
        {
            // ...
        }

1
你可以简单地循环遍历每个位。以下类似于C的伪代码允许您设置要检查的位号。(您可能还想谷歌字节序)
for()
{
  bitnumber = <your bit>
  printf("%d",(val & 1<<bitnumber)?1:0);
}

这段代码基本上是在设置位时写入1,否则写入0。我们将值1(在二进制中为1 ;) )向左移动bitnumber个位数,然后与val中的值进行AND运算以查看是否匹配。就这么简单!

因此,如果bitnumber为3,我们只需执行以下操作:

00000100(例如,将值1向左移动3位)

AND

10110110(我们将其与您的任何值进行比较)

=

00000100 = 真!- 两个值都设置了第3位比特!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接