我有一个二进制数1011011,如何逐个循环遍历这些二进制位?
我知道如何对十进制整数进行此操作,方法是使用取模运算和除法。
我有一个二进制数1011011,如何逐个循环遍历这些二进制位?
我知道如何对十进制整数进行此操作,方法是使用取模运算和除法。
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
在处理二进制数时,你可以像处理十进制数一样使用模运算和除法。你也可以使用二进制运算符,但如果你已经知道如何在十进制中使用它们,那么使用除法和模运算会更容易。
number >> 1
代替number / 2
和number & 0x1
代替number % 2
以提高性能。请注意,使用现代优化编译器可能没有区别...number
是有符号的,则会有所不同。编译器必须花费额外的精力来满足C对除法的无能定义((-3)/2==-1
,而不是应该是-2
)。当然,在许多情况下,您应该通过使用无符号类型来修复这个问题,而不是采用按位操作,但是如果您的值真的是有符号的,并且当number
为-3时想要 number%2
产生-2,那么number&1
就是正确的方法。请记住,负数的位移操作未被很好地定义。 - R.. GitHub STOP HELPING ICEwhile (val != 0)
{
printf("%d", val&0x1);
val = val>>1;
}
为了进一步说明@Marco的答案,以下是一个示例:
uint value = 0x82fa9281;
for (int i = 0; i < 32; i++)
{
bool set = (value & 0x1) != 0;
value >>= 1;
Console.WriteLine("Bit set: {0}", set);
}
这个操作会测试最后一位,然后将所有位向左移动一位。
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
}
byte input = Convert.ToByte("1011011", 2);
BitArray arr = new BitArray(new[] { input });
foreach (bool value in arr)
{
// ...
}
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位比特!