我有一个二进制数1011011,我怎么能一个接一个地遍历所有这些二进制数字呢?
我知道如何使用模数和除法对十进制整数执行此操作。
答案 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 / 2
和number & 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位!