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

25

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

#define CACHE_NUM_WAYS    (1<<1)
#define CACHE_DATA_SIZE   (1<<8)

在代码的其余部分中,它被用作整数。

这是什么意思?它的值是多少?


非常接近C#中的"<<"代表什么 - Bo Persson
8个回答

49

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)作为反向操作。


3
实际上,效率点并不准确,因为编译器足够聪明,能够将 1<<1 转换为 1*2 或者更加高效的 2 - Nawaz
4
在大多数情况下,代码中会出现像i<<22<<ii<<j这样的变量,所以编译器的优化在这里并不起作用。 - joe

10

a<<b对于整数来说意味着“左移”。a按位表示被左移b位。这相当于乘以(2的b次幂)。

所以在你的例子中,(1<<1)1*(2^1),即2(1<<8)1*(2^8),即256

值得指出的是,和C++中的其他运算符一样,<<可以被重载以执行其他功能。默认情况下,输入/输出流会重载此运算符,以让你编写简洁的代码将一些参数发送到流中。因此,你可能会看到如下的代码:

cout << something << somethingelse
在这个上下文中,“<<”并不表示左移。

感谢这个示例。 - vincenzopalazzo

6
"<<是按位左移操作符(也有>>按位右移操作符)。如果你有32位整型数。"
1      = 00000000 00000000 00000000 00000001 = 1
1 << 1 = 00000000 00000000 00000000 00000010 = 2
1 << 8 = 00000000 00000000 00000001 00000000 = 256

5

这就是为什么CACHE_NUM_WAYS为2,CACHE_DATA_SIZE为256的原因。 - Marc Plano-Lesay
#define CACHE_DATA_SIZE (1<<8)#define CACHE_DATA_SIZE 256 之间有什么区别? - Ash Burlaczenko
2
@AshBurlaczenko 没有区别。这只是一种不同的写法。1<<8 向您突出显示,这是一个位于第八位的单个 1,其余为 0(相当于 256),而 256 告诉您十进制值,并且不直接告诉您任何有关设置或清除位的信息。 - brimborium
@AshBurlaczenko 它们是相同的值,当我想记住该值为2^N并且我很可能正在查看位模式而不仅仅是值时,我使用(1<<8)。 - NominSim

3

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

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


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)

1

1<<8

这是我的理解。 以最简单的方式理解,将二进制数字系统中的1(00000001)提升到比之前高8位(位),对于每个位置,我们知道它移动的值(2进制)会呈指数倍增长,因此它变成了1 *(2 ^ 8)= 256。

所以1<<6将是1 *(2 ^ 6)= 64,依此类推。


基本上它是一个位移运算符,可以将指定数量的位向左或向右移动。 - Jain

1
在CPP中,“<<”代表左移运算符,“>>”代表右移运算符。 x<<y相当于将x乘以2^y,x>>y相当于将x除以2^y。 从理论上讲,左移运算符将第一个操作数的位向左移动,在这种情况下,右侧的操作数决定要向左移动的位数。同样地,右移运算符将第一个操作数的位向右移动,在这种情况下,右侧的操作数决定要向右移动的位数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,