按位移位(左或右)做什么以及它用于什么?

The*_*i.9 63 bit-manipulation bit-shift bitwise-operators

我已经看过运算符>>和我看过的<<各种代码(我实际上并没有理解),但我只是想知道它们实际上做了什么以及它们的实际用途是什么.

编辑

如果移位是喜欢x * 2x / 2,就是从实际使用的真正的区别*/运营商?有性能差异吗?

use*_*own 48

这是一个小程序,您可以在其中执行一些位操作,包括移位.

你有一些比特的集合,你移动它们中的一些超出它们的范围:

1111 1110 << 2 
1111 1000 
Run Code Online (Sandbox Code Playgroud)

从右边填充新鲜的零.:)

0001 1111 >> 3 
0000 0011 
Run Code Online (Sandbox Code Playgroud)

从左边填充.一个特殊情况是前导1.它通常表示负值 - 取决于语言和数据类型.所以经常需要,如果你向右移动,第一位保持不变.

1100 1100 >> 1
1110 0110 
Run Code Online (Sandbox Code Playgroud)

它在多个班次中得到保存:

1100 1100 >> 2
1111 0011
Run Code Online (Sandbox Code Playgroud)

如果你不想保留第一个位,你可以使用(在Java,Scala,C++,C afaik,甚至更多)三重符号运算符:

1100 1100 >>> 1
0110 0110 
Run Code Online (Sandbox Code Playgroud)

在另一个方向上没有等价物,因为它没有意义 - 可能在你非常特殊的背景下,但不是一般的.

在数学上,左移是a = = 2,左移2是a = 4,依此类推.右移是a/= 2,依此类推.

  • ANSI C仅定义了两个按位移位运算符>>和<<. (7认同)
  • 不,问题不是; 这就是我仍然赞成你的原因.但当时(诚然,这是差不多4年前),我觉得这是一个有价值的评论.:) (2认同)

Nit*_*ish 35

左位移位乘以2的任何幂,右位移位除以2的任何幂.例如x = x * 2;也可以写为x<<1x = x*8可以写为 x<<3(因为2的幂为3是8).同样x = x / 2;x>>1等等.


loy*_*ola 24

左移

x = x * 2^value (普通手术)

x << value (逐位操作)


x = x * 16(与之相同2^4)

左移相当于 x = x << 4

右转

x = x / 2^value (正常算术运算)

x >> value (逐位操作)


x = x / 8 (与之相同2^3)

右移相当于 x = x >> 3


Rag*_*ghu 14

左移:它等于必须被移位的值的乘积,并且2被提升到要移位的位数的幂.

示例:

1<<3
0000 0001  ---> 1
Shift by 1 bit
0000 0010 ----> 2 which is equal to 1*2^1
Shift By 2 bits
0000 0100 ----> 4 which is equal to 1*2^2
Shift by 3 bits
0000 1000 ----> 8 which is equal to 1*2^3
Run Code Online (Sandbox Code Playgroud)

右移:它等于值的商,它必须被移位2到被移位的位数的幂.

示例:

8>>3
0000 1000  ---> 8 which is equal to 8/2^0
Shift by 1 bit
0000 0100 ----> 4 which is equal to 8/2^1
Shift By 2 bits
0000 0010 ----> 2 which is equal to 8/2^2
Shift by 3 bits
0000 0001 ----> 1 which is equal to 8/2^3
Run Code Online (Sandbox Code Playgroud)


Ali*_*tad 2

一些例子:

  • 位操作,例如与Base64之间的转换(6 位而不是 8 位)
  • 进行 2 次方运算(1 << 4等于2^416)
  • 使用位时编写更具可读性的代码。例如,使用 1 << 4or定义常量1 << 5更具可读性。