位操作
位操作
在本书的大部分内容中,我们将数字,如实数的整数或浮点表示,作为我们最基本的构建模块。然而,有时候,我们有必要更深入地考虑这些数字的实际这些数字在比特方面的表示。
各种编程语言都支持位操作。我们将探讨各种选择。
结构和展示
C/C++
显示的内置可能性是有限的:
printf("Octal: %o",i);
printf("Hex : %x",i);
提供了八进制和十六进制的表示方法,但没有二进制的格式说明。取而代之的是以下:
![图](F:\学习材料\翻译\图片\图.png)![图](F:\学习材料\翻译\图片\图.png) void printBits(size_t const size, void const * const ptr)
{
unsigned char *b = (unsigned char*) ptr;
unsigned char byte;
for (int i=size-1; i>=0; i--) {
for (int j=7; j>=0; j--) {
byte = (b[i] >> j) & 1;
printf("%u", byte);
}
}
}
/* ... */
printBits(sizeof(i),&i);
Python
- python 的 int 函数将一个字符串转换为 int ,第二个参数可以指出字符串的基数是字符串的解释:
five = int(’101’,2)
maxint32 = int(’0xffffffff’,16)
- 函数 bin hex 分别将一个 int 转换为以2,8,16为基准的字符串。
- 由于 Python 中的整数可以是无限长的,所以有一个函数可以确定位的长度( Python 3.1版 ):i.bit_length()。
位操作
布尔运算通常被应用于编程语言的布尔数据类型,有些语言允许你将它们应用于实际的比特。
$$ \begin{array}{|r|lll|} \hline & \text { boolean } & \text { bitwise (C) } & \text { bitwise (Py) } \ \text { and } & \& \ & \ & \ \ \text { or } & 11 & 1 & 1 \ \text { not } & ! & & \sim \ \text { xor } & & - & \ \hline \end{array} $$
此外,还有对比特串这样的操作:
$$ \begin{array}{|r|l|} \hline \text { left shift } & \ll \ \text { right shift } & \gg \ \hline \end{array} $$
练习 29.1: 使用位操作来测试一个数是奇数还是偶数
移位操作有时被用作算术的有效速记,例如,一个左移一个位置对应于乘以2。
练习 29.2: 给定一个整数 n ,求小于 n 的8的最大倍数
这种机制有时被用来分配对齐的内存。写一个例程
aligned_malloc( int Nbytes, int aligned_bits );
分配了 Nbytes 的内存,其中第一个字节的地址是 aligned_bits 的倍数。