【发布时间】:2012-06-14 12:48:26
【问题描述】:
我有一个包含以下定义的 C++ 头文件:
#define CACHE_NUM_WAYS (1<<1)
#define CACHE_DATA_SIZE (1<<8)
在其余代码中用作整数。
这是什么意思?它的价值是什么?
【问题讨论】:
我有一个包含以下定义的 C++ 头文件:
#define CACHE_NUM_WAYS (1<<1)
#define CACHE_DATA_SIZE (1<<8)
在其余代码中用作整数。
这是什么意思?它的价值是什么?
【问题讨论】:
【讨论】:
#define CACHE_DATA_SIZE (1<<8)和#define CACHE_DATA_SIZE 256有什么区别。
1<<8 向您强调,这是在第 8 个位置的单个 1,其余的是 0(等于 256),而 256 告诉您十进制值并且不直接告诉您任何关于设置或清除位。
运算符<< 是按位左移运算符。
所以当你写1<<17时,1的二进制表示左移17位为:
//before (assume 1 is represented by 32-bit)
1 << 17
0000 0000 0000 0000 0000 0000 0000 0001 << 17 (before - binary representation)
//after
0000 0000 0000 0010 0000 0000 0000 0000 (after - binary representation)
【讨论】:
<< 是按位左移(还有>> 是按位右移)
如果你有 32 位整数
1 = 00000000 00000000 00000000 00000001 = 1
1 << 1 = 00000000 00000000 00000000 00000010 = 2
1 << 8 = 00000000 00000000 00000001 00000000 = 256
【讨论】:
1
00000000 00000001 changes to 00000000 00000010
1
00000000 00000001 changes to 00000001 00000000
这是一个位移操作。对于右侧的每个 1,您可以将自己视为将左侧的值乘以 2。因此,2
此外,您可以将 4 >> 1 = 2(和 5 >> 1 = 2,因为您向下舍入)作为逆运算。
【讨论】:
1<<1 转换为1*2,如果它认为后者有效,则只需将2。
i<<2 或2<<i 或i<<j 之类的变量,因此此处不考虑编译器优化。
a<<b 对于整数表示“左移”。 a 的按位表示左移b 位。这与乘以(2 的b 的幂)相同。
所以在你的例子中,(1<<1) 是 1*(2^1) 是 2,(1<<8) 是 1*(2^8) 是 256。
值得指出的是,一般而言,与 c++ 中的其他运算符一样,<< 可能会被覆盖以执行其他功能。默认情况下,输入/输出流会覆盖此运算符,以便您编写简洁的代码以将一堆参数发送到流。所以你可能会看到这样的代码:
cout << something << somethingelse
并且<< 在这种情况下不是意味着左移。
【讨论】:
1
这就是我的理解。 以最通俗的方式,将其理解为二进制数系统中的 1(00000001)现在从之前的位置提升到前面的 8 位(位), 并且对于我们所知道的每个地方,它移动的值(二进制中的 2)都成指数倍增 所以它变成了 1*(2^8)=256。
所以 1
【讨论】:
a 意思 (a * pow(2,b))-> a * 2^b //左筛运算符
a>>b 表示 (a / pow(2,b))-> a / 2^b //右筛选运算符 >>
【讨论】: