【发布时间】:2010-12-16 21:21:02
【问题描述】:
我不知道如何实现以下算法。
例如我有 int=26,这是二进制的“11010”。 现在我需要对 1 执行一个操作,对 0 执行另一个操作,从左到右,直到字节结束。 但我真的不知道如何实现这一点。 也许我可以将二进制转换为 char 数组,但我不知道如何。 顺便说一句,int 仅在示例中等于 26,在应用程序中它将是随机的。
【问题讨论】:
我不知道如何实现以下算法。
例如我有 int=26,这是二进制的“11010”。 现在我需要对 1 执行一个操作,对 0 执行另一个操作,从左到右,直到字节结束。 但我真的不知道如何实现这一点。 也许我可以将二进制转换为 char 数组,但我不知道如何。 顺便说一句,int 仅在示例中等于 26,在应用程序中它将是随机的。
【问题讨论】:
既然你想从“左到右”移动:
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 循环只是遍历一个字节中的每个位,从最高有效位到最低位。
【讨论】:
unsigned char,因为您表示您有兴趣对每个位执行“直到字节结束”的操作。如果您对大于一个字节的对象感兴趣,请使用适当的类型,但您需要更改mask 中的起始位。注意:mask 不是随机的 - 它跟踪每一步检查的位。如果您希望您检查的位的值是随机的,那很好。但是,将其设置为您想要的任何内容。我在示例中使用了26,因为这就是您在示例中使用的。设置为您的应用程序所需的任何数据。
mask=1<<7 而不是 mask=0x80 可能会更自文档化。相比之下,对于 int,您可以从mask=1<<31 开始,从最高有效位开始,或者从mask=1<<7 开始,如果您想从最低有效字节的最高有效位开始。
我使用这个选项:
isBitSet = ((bits & 1) == 1);
bits = bits >> 1
我也在 stackoverflow 中找到了答案:
How do I properly loop through and print bits of an Int, Long, Float, or BigInteger?
【讨论】:
您可以使用模算术或位掩码来获得所需的内容。
模运算:
int x = 0b100101;
// First bit
(x >> 0) % 2; // 1
// Second bit
(x >> 1) % 2; // 0
// Third bit
(x >> 2) % 2; // 1
...
etc.
位掩码
int x = 0b100101;
int mask = 0x01;
// First bit
((mask << 0) & x) ? 1 : 0
// Second bit
((mask << 1) & x) ? 1 : 0
...
etc.
【讨论】:
在 C、C++ 和类似语法的语言中,您可以通过检查 i & 1 是非零还是零来确定整数 i 中最右边的位是 1 还是 0。 (请注意,这是一个单一的& 表示按位与运算,而不是一个&& 表示逻辑与。)对于右第二位,您检查i & 2;对于第三个,您检查i & 4,依此类推。
更一般地,要确定右边的jth 位是否为零,您可以检查i & (1 << (j-1)) != 0 是否。 << 表示左移; 1 << (j-1) 本质上等同于 2j-1。
因此,对于 32 位整数,您的循环将如下所示:
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 */
}
希望这足以让您入门。
【讨论】:
遇到了类似的问题,所以我想分享我的解决方案。这是假设您的值始终是一个字节(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);
}
}
【讨论】:
我不确定你说你想做什么。如果有帮助,您可能可以使用位掩码对字节进行任何位操作。
【讨论】:
嗨 查找位移位和位与。
【讨论】: