如何循环二进制数字的数字?

时间:2010-11-07 07:42:55

标签: c# .net c binary bit-manipulation

我有一个二进制数1011011,我怎么能一个接一个地遍历所有这些二进制数字呢?

我知道如何使用模数和除法对十进制整数执行此操作。

9 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

你可以使用模2和除法2,就像你在10中一样。你也可以使用二元运算符,但如果你已经知道如何在基数10中这样做,那么如果你只使用除法和模数会更容易

答案 2 :(得分:3)

扩展Frédéric和Gabi的答案,你需要做的就是意识到基数2中的规则与基数10没有区别 - 你只需要用除数2而不是10来进行除法和模数。

下一步只是使用number >> 1代替number / 2number & 0x1而不是number % 2来提高效果。请注意,现代优化编译器可能没什么区别......

答案 3 :(得分:2)

使用增加2的幂的AND ...

答案 4 :(得分:2)

至少在C中,您可以执行以下操作:

while (val != 0)
{
   printf("%d", val&0x1);
   val = val>>1;
}

答案 5 :(得分: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);
}

这样做是测试最后一位,然后将所有内容移位一点。

答案 6 :(得分: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
}

答案 7 :(得分:1)

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

答案 8 :(得分:1)

你可以简单地遍历每一位。以下C类伪代码允许您设置要检查的位数。 (您可能还想谷歌字节顺序)

for()
{
  bitnumber = <your bit>
  printf("%d",(val & 1<<bitnumber)?1:0);
}

如果设置的位,代码基本上写入1,否则写入0。我们将值1(以二进制为1;)移位到bitnumber中设置的位数,然后我们将它与val中的值进行比较以查看它是否匹配。就这么简单!

因此,如果位数为3,我们只需执行此操作

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

10110110(我们检查它的价值是什么)

=

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