The*_*i.9 63 bit-manipulation bit-shift bitwise-operators
我已经看过运算符>>和我看过的<<各种代码(我实际上并没有理解),但我只是想知道它们实际上做了什么以及它们的实际用途是什么.
编辑
如果移位是喜欢x * 2和x / 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,依此类推.
Nit*_*ish 35
左位移位乘以2的任何幂,右位移位除以2的任何幂.例如x = x * 2;也可以写为x<<1或x = 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)