如何通过一个字节的每个位

时间:2010-12-16 21:21:02

标签: c algorithm

我不知道如何实现以下算法。

例如,我有int = 26,这是二进制的“11010”。 现在我需要实现1的一个操作,另一个操作为0,从左到右,直到字节结束。 但我真的不知道如何实现这一点。 也许我可以将二进制转换为char数组,但我不知道如何。 btw,int仅在示例中等于26,在应用程序中它将是随机的。

7 个答案:

答案 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);
    }
}