我有一个包含以下定义的C++头文件:
#define CACHE_NUM_WAYS (1<<1)
#define CACHE_DATA_SIZE (1<<8)
在代码的其余部分中,它被用作整数。
这是什么意思?它的值是多少?
1 << 1 的意思是:
00000000 00000001 changes to 00000000 00000010
1 << 8 的意思是:
00000000 00000001 changes to 00000001 00000000
这是一个位移操作。对于每个在右边的1,你可以认为将左边的值乘以2。所以,2 << 1 = 4,2 << 2 = 8。与执行1 * 2相比,这更有效率。
此外,你可以执行4 >> 1 = 2(由于向下取整,5 >> 1 = 2)作为反向操作。
1<<1 转换为 1*2 或者更加高效的 2。 - Nawazi<<2或2<<i或i<<j这样的变量,所以编译器的优化在这里并不起作用。 - joea<<b对于整数来说意味着“左移”。a按位表示被左移b位。这相当于乘以(2的b次幂)。
所以在你的例子中,(1<<1)是1*(2^1),即2,(1<<8) 是 1*(2^8),即256。
值得指出的是,和C++中的其他运算符一样,<<可以被重载以执行其他功能。默认情况下,输入/输出流会重载此运算符,以让你编写简洁的代码将一些参数发送到流中。因此,你可能会看到如下的代码:
cout << something << somethingelse
在这个上下文中,“<<”并不表示左移。
<<是按位左移操作符(也有>>按位右移操作符)。如果你有32位整型数。"
1 = 00000000 00000000 00000000 00000001 = 1
1 << 1 = 00000000 00000000 00000000 00000010 = 2
1 << 8 = 00000000 00000000 00000001 00000000 = 256
这些是位移运算符。
http://msdn.microsoft.com/zh-cn/library/336xbhcz(v=vs.80).aspx
<< 是左移,所以 << 1 实际上是乘以 2,<< 8 则是乘以 2^8。
#define CACHE_DATA_SIZE (1<<8) 和 #define CACHE_DATA_SIZE 256 之间有什么区别? - Ash Burlaczenko1<<8 向您突出显示,这是一个位于第八位的单个 1,其余为 0(相当于 256),而 256 告诉您十进制值,并且不直接告诉您任何有关设置或清除位的信息。 - brimboriuma<<b 表示 (a * pow(2,b))-> a * 2^b //左移运算符 <<
a>>b 表示 (a / pow(2,b))-> a / 2^b //右移运算符 >>
运算符<<是一个按位左移运算符。
因此,当您编写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)
1<<8
这是我的理解。 以最简单的方式理解,将二进制数字系统中的1(00000001)提升到比之前高8位(位),对于每个位置,我们知道它移动的值(2进制)会呈指数倍增长,因此它变成了1 *(2 ^ 8)= 256。
所以1<<6将是1 *(2 ^ 6)= 64,依此类推。