通过位运算理解 C++ 中的二进制转换实现
Understanding binary conversion implementation in C++ with bit operations
我有兴趣了解十进制转二进制的实现。有人可以阐明在以下代码中使用左移和右移的目的吗?
void static inline unsignedToBinary(unsigned x, char*& bin)
{
bin = (char*) malloc(33);
int p = 0;
for (unsigned i = (1 << 31); i > 0; i >>= 1)
bin[p++] = ((x&i) == i) ? '1' : '0';
bin[p] = '[=10=]';
}
这是使用位运算的二进制转换的直接实现。
- 变量
i
表示mask - 包含2k值的int
,其中k
是位的位置。
- 初始值为231,由left-shifting
1
由31. 生成
for
循环使用 >>= 1
到 right-shift 掩码,直到 1
移出它,使 i == 0
.
- 在每次迭代中,
x&i
与 i
进行比较。当 x
在 i
有它的 1
的位置包含 1
时比较成功;否则失败。
注:虽然在C++中使用malloc
固然是允许的,但并不理想。如果您想继续使用 C 字符串,请改用 new char[33]
。更像 C++ 的方法是使用 std::string
.
我有兴趣了解十进制转二进制的实现。有人可以阐明在以下代码中使用左移和右移的目的吗?
void static inline unsignedToBinary(unsigned x, char*& bin)
{
bin = (char*) malloc(33);
int p = 0;
for (unsigned i = (1 << 31); i > 0; i >>= 1)
bin[p++] = ((x&i) == i) ? '1' : '0';
bin[p] = '[=10=]';
}
这是使用位运算的二进制转换的直接实现。
- 变量
i
表示mask - 包含2k值的int
,其中k
是位的位置。 - 初始值为231,由left-shifting
1
由31. 生成
for
循环使用>>= 1
到 right-shift 掩码,直到1
移出它,使i == 0
.- 在每次迭代中,
x&i
与i
进行比较。当x
在i
有它的1
的位置包含1
时比较成功;否则失败。
注:虽然在C++中使用malloc
固然是允许的,但并不理想。如果您想继续使用 C 字符串,请改用 new char[33]
。更像 C++ 的方法是使用 std::string
.