我不知道如何实现以下算法。
例如,我有int = 26,这是二进制的“11010”。 现在我需要实现1的一个操作,另一个操作为0,从左到右,直到字节结束。 但我真的不知道如何实现这一点。 也许我可以将二进制转换为char数组,但我不知道如何。 btw,int仅在示例中等于26,在应用程序中它将是随机的。
答案 0 :(得分:8)
因为你想从“从左到右”移动:
unsigned char val = 26; // or whatever
unsigned int mask;
for (mask = 0x80; mask != 0; mask >>= 1) {
if (val & mask) {
// bit is 1
}
else {
// bit is 0
}
}
for
循环只是遍历一个字节中的每个位,从最高位到最小位。
答案 1 :(得分:4)
您可以使用模运算或位掩码来获得所需的内容。
模运算:
int x = 0b100101;
// First bit
(x >> 0) % 2; // 1
// Second bit
(x >> 1) % 2; // 0
// Third bit
(x >> 2) % 2; // 1
...
etc.
Bitmasking
int x = 0b100101;
int mask = 0x01;
// First bit
((mask << 0) & x) ? 1 : 0
// Second bit
((mask << 1) & x) ? 1 : 0
...
etc.
答案 2 :(得分:3)
我使用这个选项:
isBitSet = ((bits & 1) == 1);
bits = bits >> 1
我在stackoverflow中也找到了答案:
How do I properly loop through and print bits of an Int, Long, Float, or BigInteger?
答案 3 :(得分:2)
在C,C ++和类似语法的语言中,您可以通过检查i
是非零还是零来确定整数i & 1
中最右边的位是1还是0。 (请注意,这是一个&
表示按位AND操作,而不是&&
表示逻辑AND。)对于第二个到右边的位,检查i & 2
;对于第三个,你检查i & 4
,依此类推两个。
更一般地,为了确定右边的j
位是否为零,您可以检查i & (1 << (j-1)) != 0
是否为<<
。 1 << (j-1)
表示左移; unsigned int i = 26; /* Replace this with however it's actually defined. */
int j;
for (j = 31; j >= 0; j--)
{
if ((i & (1 << (j-1))) != 0)
/* do something for jth bit is 1 */
else
/* do something for jth bit is 0 */
}
基本上相当于2 j-1 。
因此,对于32位整数,您的循环看起来像这样:
{{1}}
希望这足以让你开始。
答案 4 :(得分:0)
我不确定你说你想做什么。你可以使用位掩码在你的字节中进行任何位操作,如果这有帮助的话。
答案 5 :(得分:0)
您好 查找位移位和按位。
答案 6 :(得分:0)
遇到一个类似的问题,以为我会分享我的解决方案。假设您的值始终是一个字节(8位)
遍历字节中的所有8位并检查该位是否已设置(您可以通过将要检查的位移到LSB位置并用0x01
对其进行掩码来实现此目的)
int value = 26;
for (int i = 0; i < 8; i++) {
if ((value >> i) & 0x01) {
// Bit i is 1
printf("%d is set\n", i);
}
else {
// Bit i is 0
printf("%d is cleared\n", i);
}
}