如何在C++中操作和表示二进制数
How to manipulate and represent binary numbers in C++
我目前正试图使用一个非常简单的预序遍历算法为huffman树构建一个查找表,但我在执行非常基本的逐位操作时遇到了困难。psuedo代码如下:
void preOrder(huffNode *node, int bit) //not sure how to represent bit
{
if (node == NULL)
return;
(1) bit = bit + 0; //I basically want to add a 0 onto this number (01 would go to 010)
preOrder(node->getLeft(), bit);
(2) bit = bit - 0 + 1; //This should subtract the last 0 and add a 1 (010 would go to 011)
preOrder(node->getRight());
}
我对如何执行第(1)行和第(2)行中定义的操作感到非常困惑
使用哪种数据类型来表示和打印二进制数字?在上面的例子中,我将数字表示为int,但我确信这是不正确的。此外,如何添加或减去值?我理解如何&和|types逻辑是有效的,但我对如何在代码中执行这些操作感到困惑。
有人能举一些非常简单的例子吗?
下面是一些二进制运算的基本示例。我在这里使用的大多是就地操作。
int bit = 0x02; // 0010
bit |= 1; // OR 0001 -> 0011
bit ^= 1; // XOR 0001 -> 0010
bit ^= 7; // XOR 0111 -> 0101
bit &= 14; // AND 1110 -> 0100
bit <<= 1; // LSHIFT 1 -> 1000
bit >>= 2; // RSHIFT 2 -> 0010
bit = ~bit; // COMPLEMENT -> 1101
如果你想打印一个二进制数字,你需要自己做。。。这里有一种效率稍低但可读性适中的方法:
char bitstr[33] = {0};
for( int b = 0; b < 32; b++ ) {
if( bit & (1 << (31-b)) )
bitstr[b] = '1';
else
bitstr[b] = '0';
}
printf( "%sn", bitstr );
[edit]如果我想要更快的代码,我可能会为0-255的所有数字预生成(或硬编码)一个具有8位序列的查找表。
// This turns a 32-bit integer into a binary string.
char lookup[256][9] = {
"00000000",
"00000001",
"00000010",
"00000011",
// ... etc (you don't want to do this by hand)
"11111111"
};
char * lolo = lookup[val & 0xff];
char * lohi = lookup[(val>>8) & 0xff];
char * hilo = lookup[(val>>16) & 0xff];
char * hihi = lookup[(val>>24) & 0xff];
// This part is maybe a bit lazy =)
char bitstr[33];
sprintf( "%s%s%s%s", hihi, hilo, lohi, lolo );
相反,你可以这样做:
char *bits = bitstr;
while( *hihi ) *bits++ = *hihi++;
while( *hilo ) *bits++ = *hilo++;
while( *lohi ) *bits++ = *lohi++;
while( *lolo ) *bits++ = *lolo++;
*bits = 0;
或者干脆把整件事展开
char bitstr[33] = {
hihi[0], hihi[1], hihi[2], hihi[3], hihi[4], hihi[5], hihi[6], hihi[7],
hilo[0], hilo[1], hilo[2], hilo[3], hilo[4], hilo[5], hilo[6], hilo[7],
lohi[0], lohi[1], lohi[2], lohi[3], lohi[4], lohi[5], lohi[6], lohi[7],
lolo[0], lolo[1], lolo[2], lolo[3], lolo[4], lolo[5], lolo[6], lolo[7],
0 };
当然,查找中的这8个字节与64位整数的长度相同。。。那么这个呢?比那些毫无意义地在字符数组中漫游要快得多。
char bitstr[33];
__int64 * intbits = (__int64*)bitstr;
intbits[0] = *(__int64*)lookup[(val >> 24) & 0xff];
intbits[1] = *(__int64*)lookup[(val >> 16) & 0xff];
intbits[2] = *(__int64*)lookup[(val >> 8) & 0xff];
intbits[3] = *(__int64*)lookup[val & 0xff];
bitstr[32] = 0;
当然,在上面的代码中,您可以将查找值表示为int64,而不是字符串。
不管怎样,只要指出你可以写它,这对你的目的来说是合适的。如果你需要优化,事情会很有趣,但对于大多数实际应用程序来说,这样的优化是微不足道或毫无意义的。
除非二进制序列比int中的位数长,否则可以使用int。
若要将0添加到的当前表示形式的末尾,可以使用a<lt;1
若要将当前表示形式末尾的0替换为1,可以使用a^=1
请注意,要以这种方式使用int,您还需要跟踪int中您的位的起始位置,这样,如果您有值0x0,您就可以知道0,00,000,…中的哪一个。。。是的。
代码中的操作:
(1) bit = bit << 1;
(2) bit = bit|1;
但是,您还必须保持序列的长度。
若int的长度对你们来说足够好,并没有理由不使用它。然而,在huffman算法中,它实际上取决于数据。C++程序员应该对任意长度的位序列使用boost::dynamic_bitset。它还支持上面的位操作。http://www.boost.org/doc/libs/1_42_0/libs/dynamic_bitset/dynamic_bitset.html
- visual在c++中将十进制数转换为二进制数
- 二进制数之和(使用C样式字符串)
- 以 10 c++ 为基数显示 1024 位二进制数
- 二进制数和位标志'x'
- C++ 二进制数到整数值的数组
- 二进制数组中最大连续 1 的起始和结束索引,以 C++ 为单位
- dev如何在C++中比较二进制数
- 递归回溯打印长度为N的二进制数的所有组合,而不使用循环
- 向后打印二进制数
- 使用位黑客反转二进制数
- 添加两个二进制数(整数数组)
- 从 0 到 n 的二进制数,具有相同数量的字符/
- 我通过迭代加法将二进制数转换为十进制并检查单个字符(请参阅代码)的方法有什么问题?
- 所有测试用例都将小数点转换为二进制数
- 尝试将二进制数组转换为十六进制C++然后打印结果
- 如何缩放二进制数组以保留值
- 如何在C++中操作和表示二进制数
- 如何在C++中表示二进制字节数组数据
- 将二进制数更改为2C表示法
- 如何在C++中表示二进制数(用于霍夫曼编码器)