我有一个 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)
它在其余代码中用作整数。
这是什么意思?它的价值是什么?
这些是按位移位运算符。
http://msdn.microsoft.com/en-us/library/336xbhcz(v=vs.80).aspx
<< 向左移动,因此对于 << 1 它实际上乘以 2,对于 << 8 乘以 2^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 因为您向下舍入)作为逆运算。
<<
如果您有 32 位整数,则按位左移(也有>>
按位右移)
1 = 00000000 00000000 00000000 00000001 = 1
1 << 1 = 00000000 00000000 00000000 00000010 = 2
1 << 8 = 00000000 00000000 00000001 00000000 = 256
a<<b
对于整数意味着“左移”。的按位表示a
是左移位b
。这与乘以 (2 的b
) 的幂相同。
所以在你的例子中,(1<<1)
is 1*(2^1)
is 2
,(1<<8)
is 1*(2^8)
is 256
。
值得指出的是,一般来说,与 c++ 中的其他运算符一样,<<
可能会被重写以执行其他功能。默认情况下,输入/输出流会覆盖此运算符,以便您编写简洁的代码以将一堆参数发送到流。所以你可能会看到这样的代码:
cout << something << somethingelse
在这种情况下,<<
并不意味着左移。
这些是按位移位运算符。
http://msdn.microsoft.com/en-us/library/336xbhcz(v=vs.80).aspx
<< 向左移动,因此对于 << 1 它实际上乘以 2,对于 << 8 乘以 2^8。
该运算符<<
是按位左移运算符。
因此,当您编写 时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 等等
a<<b 表示 (a * pow(2,b))-> a * 2^b //左筛选运算符 <<
a>>b 表示 (a / pow(2,b))-> a / 2^b //右筛选运算符 >>