我有一个C ++头文件,其中包含以下定义:
#define CACHE_NUM_WAYS (1<<1)
#define CACHE_DATA_SIZE (1<<8)
它在代码的其余部分用作整数。
这是什么意思?它的价值是什么?
答案 0 :(得分:26)
1&lt;&lt; 1表示:
00000000 00000001 changes to 00000000 00000010
1&lt;&lt; 8表示:
00000000 00000001 changes to 00000001 00000000
这是一个转移操作。对于右侧的每1个,您可以将自己视为左侧的值乘以2.因此,2&lt;&lt; 1 = 4且2 <&lt; 1 2 = 8.这比做1 * 2效率更高。
另外,你可以做4&gt;&gt; 1 = 2(并且在向下舍入时5>&gt;> 1 = 2)作为逆操作。
答案 1 :(得分:5)
那些是按位移位运算符。
http://msdn.microsoft.com/en-us/library/336xbhcz(v=vs.80).aspx
&LT;&LT;向左移动所以它实际上乘以2为&lt;&lt; &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 8。
答案 2 :(得分:5)
<<
向左按位移位(还有>>
按位向右移位)
如果你有32位整数
1 = 00000000 00000000 00000000 00000001 = 1
1 << 1 = 00000000 00000000 00000000 00000010 = 2
1 << 8 = 00000000 00000000 00000001 00000000 = 256
答案 3 :(得分:4)
a<<b
表示“向左移”。 a
的按位表示向左移位b
位。这与乘以(2到b
的幂)相同。
因此,在您的示例中,(1<<1)
1*(2^1)
为2
,(1<<8)
1*(2^8)
为256
。
值得指出的是,通常,与c ++中的其他运算符一样,<<
可能会被覆盖以执行其他功能。默认情况下,输入/输出流会覆盖此运算符,以便您编写简洁的代码以将一堆参数发送到流。所以你可能会看到这样的代码:
cout << something << somethingelse
和<<
不意味着在这种情况下左移。
答案 4 :(得分:3)
运算符<<
是一个按位左移运算符。
因此,当您编写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)