C++:(a << b)是什么意思?

ita*_*mar 15 c++ operators

我有一个C++头文件,其中包含以下定义:

#define CACHE_NUM_WAYS    (1<<1)
#define CACHE_DATA_SIZE   (1<<8)
Run Code Online (Sandbox Code Playgroud)

它在其余代码中用作整数.

这是什么意思?它的价值是什么?

Joh*_*0te 28

1 << 1表示:

00000000 00000001 changes to 00000000 00000010
Run Code Online (Sandbox Code Playgroud)

1 << 8表示:

00000000 00000001 changes to 00000001 00000000
Run Code Online (Sandbox Code Playgroud)

这是一个转移操作.对于右侧的每1个,您可以将自己视为左侧的值乘以2.因此,2 << 1 = 4和2 << 2 = 8.这比执行1*2更有效.

此外,您可以将4 >> 1 = 2(和5 >> 1 = 2,因为向下舍入)作为反向操作.

  • @Nawaz:在大多数情况下,有一个变量,如`i << 2`或`2 << i`或`i << j`,因此编译器优化不计入此处. (3认同)
  • 实际上,效率点并非如此,因为编译器足够聪明,可以将"1 << 1"转换为"1*2"或简单地将"2"转换为"2". (2认同)

Ran*_*Ran 5

那些是按位移位运算符.

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

<<向左移动所以它实际上乘以2表示<< 1,乘以2 ^ 8表示<< 8.

  • @AshBurlaczenko没有区别.它只是一种不同的写作方式.`1 << 8`向你强调,这是在第八个位置的单个`1`,其余为'0'(等于256),而'256`告诉你十进制值并不直接告诉你你有关设置或清除位的任何信息. (2认同)

jac*_*doe 5

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

1      = 00000000 00000000 00000000 00000001 = 1
1 << 1 = 00000000 00000000 00000000 00000010 = 2
1 << 8 = 00000000 00000000 00000001 00000000 = 256
Run Code Online (Sandbox Code Playgroud)


moo*_*dow 5

a<<b对于整数表示“向左移动”。的按位表示a是左移位b。这等于乘以(2的幂b)。

因此,在您的示例中,(1<<1)is 1*(2^1)2(1<<8)is 1*(2^8)256

值得指出的是,通常,与c ++中的其他运算符一样,它们<<可能会被覆盖以执行其他功能。默认情况下,输入/输出流将覆盖此运算符,以使您可以编写简洁的代码将一堆参数发送到该流。因此,您可能会看到如下代码:

cout << something << somethingelse
Run Code Online (Sandbox Code Playgroud)

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