我已经在各种代码中看到了运算符>>
和<<
(我实际上并没有理解这些代码),但我只是想知道它们实际上做了什么以及它们是什么它们的一些实际用途是。
修改
如果转变与x * 2
和x / 2
相同,那么实际使用*
和/
运算符的真正区别是什么?是否有性能差异?
答案 0 :(得分:46)
这是一个applet,您可以在其中执行一些位操作,包括移位。
你有一些比特集合,你可以将它们中的一些移出界限:
1111 1110 << 2
1111 1000
从右边用新鲜的零填充。 :)
0001 1111 >> 3
0000 0011
从左边填充。一个特殊情况是前导1.它通常表示负值 - 取决于语言和数据类型。所以经常需要,如果你向右移动,第一位保持不变。
1100 1100 >> 1
1110 0110
并且在多个班次中保存:
1100 1100 >> 2
1111 0011
如果你不想保留第一位,你可以使用(在Java,Scala,C ++,C afaik,甚至更多)三重符号运算符:
1100 1100 >>> 1
0110 0110
在另一个方向上没有等价物,因为它没有任何意义 - 可能在你非常特殊的背景下,但不是一般的。
数学上,左移是a = = 2,左移2是* = 4,依此类推。右移是a / = 2,依此类推。
答案 1 :(得分:34)
左移位乘以2的任何幂,右移位除以2的任何幂。例如,x = x * 2;
也可以写为x<<1
或x = x*8
可写为
x<<3
(因为2到3的幂是8)。同样,x = x / 2;
为x>>1
,依此类推。
答案 2 :(得分: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
答案 3 :(得分: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
右移:它等于值的商,它必须被移动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
答案 4 :(得分:3)
与/或*运算符相比,位移运算符更有效。在计算机体系结构中,除(/)或乘(*)需要多于1个时间单位并注册到计算结果,而位移运算符只是一个寄存器和一个时间单位计算。
答案 5 :(得分:3)
左移位乘以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);
答案 6 :(得分:2)
一些例子:
1 << 4
等于2^4
,即16)1 << 4
或1 << 5
更具可读性。答案 7 :(得分:2)
是的,我认为在性能方面你可能会发现差异,因为按位左右移位操作可以执行复杂的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;
此外,执行逐位操作就像严格复制用户级数学运算(这是微控制器和处理器处理的最终机器级指令)。
答案 8 :(得分:0)
以下是一个例子:
#include"stdio.h"
#include"conio.h"
void main()
{
int rm,vivek;
clrscr();
printf("enter the any numbers\t(e.g)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();
}