21

我有一个 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。

4

7 回答 7

39

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 因为您向下舍入)作为逆运算。

于 2012-06-11T15:29:46.050 回答
6

<<如果您有 32 位整数,则按位左移(也有>>按位右移)

1      = 00000000 00000000 00000000 00000001 = 1
1 << 1 = 00000000 00000000 00000000 00000010 = 2
1 << 8 = 00000000 00000000 00000001 00000000 = 256
于 2012-06-11T15:29:08.540 回答
6

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

在这种情况下,<<并不意味着左移。

于 2012-06-11T15:32:42.133 回答
5

这些是按位移位运算符。

http://msdn.microsoft.com/en-us/library/336xbhcz(v=vs.80).aspx

<< 向左移动,因此对于 << 1 它实际上乘以 2,对于 << 8 乘以 2^8。

于 2012-06-11T15:27:22.597 回答
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)
于 2012-06-11T15:28:49.363 回答
0

1<<8

这就是我的理解。以最通俗的方式,将其理解为二进制数系统中的 1 (00000001) 现在从之前的位置提升到 8 个位置(位),并且对于我们所知道的每个位置,它都会移动值(二进制中的 2)以指数方式相乘,因此变为 1*(2^8)=256。

所以 1<<6 将是 1*(2^6)= 64 等等

于 2021-11-12T04:31:04.910 回答
-1

a<<b 表示 (a * pow(2,b))-> a * 2^b //左筛选运算符 <<

a>>b 表示 (a / pow(2,b))-> a / 2^b //右筛选运算符 >>

于 2022-01-07T07:50:44.883 回答