什么是按位移(左或右)做什么和它用于什么?
我已经看到了我所看到的各种代码中的运算符>>
和<<
(我其实都没有理解),但是我只是想知道他们实际上做了什么以及它们的实际用途是什么。
编辑
如果这些变化像x * 2
和x / 2
,实际使用*
和/
操作符有什么实际的区别? 是否有性能差异?
这是一个小程序 ,您可以在其中进行一些位操作,包括移位。
你有一些位,你移动它们的一些超出界限:
1111 1110 << 2 1111 1000
它是从右边用新鲜的零填充。 🙂
0001 1111 >> 3 0000 0011
从左边填充。 一个特殊情况是领先的1.它通常表示一个负值 – 取决于语言和数据types。 通常情况下,这是需要的,如果你右移,第一位保持原样。
1100 1100 >> 1 1110 0110
而且它是多次保存的:
1100 1100 >> 2 1111 0011
如果你不想保留第一位的话,你可以使用(用Java,Scala,C ++,C afaik等等)一个三重符号运算符:
1100 1100 >>> 1 0110 0110
在另一个方向上没有相应的东西,因为它没有任何意义 – 也许在你的特殊环境中,但不是一般的。
在math上,左移是a * = 2,左移2是a * = 4等等。 右移是a = 2,依此类推。
左移位乘以2的任何幂乘右移位除以2的任何幂。 例如x = x * 2;
也可以写成x<<1
或x = x*8
可以写成x<<3
(因为2的3次方是8)。 类似地x = x / 2;
是x>>1
等等。
左移
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
左移 :等于需要移位的值的乘积,并且等于移位的位数。
例如:
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
右移 :等于需要移位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
移位运算符与/或*运算符相比效率更高。 在计算机体系结构中,除(/)或乘(*)取一个以上的时间单元和寄存器来计算结果,而位移运算符则只是一个寄存器和一个时间单元的计算。
一些例子:
- 比特操作,例如,从base64(这是6位而不是8)
- 做2次操作的权力(
1 << 4
等于2^4
即16) - 处理比特时编写更多可读代码。 例如,使用
1 << 4
或1 << 5
定义常量更具可读性。
是的,我认为性能明智,你可能会发现一个差异,左转和右转操作可以执行复杂的o(1)与巨大的数据集。
例如计算2 ^ n的能力: –
int value = 1; while (exponent<n) { //print out current power of 2 value =value *2; // equivalent machine level left shift bit wise operation exponent++; } }
按位左移操作的类似代码将会是:
value = 1 << n;
而且,按位操作就像用户级math操作(这是由微控制器和处理器处理的最终机器级指令)的严格复制一样。
左移位乘以2的任何幂。 右移位除以2的任何幂。
x = x << 5; // Left shift y = y >> 5; // Right shift
在C / C ++中可以写成,
#include <math.h> x = x * pow(2, 5); y = y / pow(2, 5);
这里是一个例子:
#include"stdio.h" #include"conio.h" void main() { int rm,vivek; clrscr(); printf("enter the any numbers\t(eg)1,2,5"); scanf("%d",&rm);//rm=5(0101)<<2(two step add zero's)so,value is 10100 printf("this lift shitf value%d=%d",rm,rm<<4); printf("this right shitf value%d=%d",rm,rm>>2); getch(); }