什么是按位移(左或右)做什么和它用于什么?

我已经看到了我所看到的各种代码中的运算符>><< (我其实都没有理解),但是我只是想知道他们实际上做了什么以及它们的实际用途是什么。

编辑

如果这些变化像x * 2x / 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<<1x = 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 << 41 << 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(); }