循环左移 和循环右移是什么意思啊

循环左移 和循环右移是什么意思啊,第1张

循环移位就是把数值变成二进制,然后循环移动的过程。

换句话说,循环移位就是将移出的低位放到该数的高位(循环右移)或把移出的高位放到该数的低位(循环左移),左移,和右移动都是对整数进行的 *** 作,在Win32控制台应用程序中,整形占4Byte节32bit。

循环左移的过程可以分为3步:

1、将x左端的n位先移动到y的低n位中,x>>(32-n);

2、将x左移n位,其右面低位补0,x<<n;

3、进行按位或运算(x >> (32 - n) | (x << n));

循环右移的过程可以分为3步: 

1、将x的左端的低n位先移动到y的高n位中x<<(32-n)

2、将x右移n位,其左面高n位补0x>>n;

3、进行按位或 *** 作(x << (32 - n) | (x >> n));

扩展资料

C语言实现循环移位:循环移位是对二进制序列进行 *** 作,所以实现循环移位先需要将需要移位的数转换为二进制序列,然后按照上面描述的步骤进行移位,最后将移位后的二进制序列打印出来。

所谓循环移位是指在移位时不丢失移位前原范围的位,而是将它们作为另一端的补入位。例如循环右移n位,指各位右移n位,原来的低n位变成高n位,指各位右移n位,原来的低n位变成高n位。

用到循环移位的 *** 作时,在汇编里面是比较容易实现的,ror,rol指令就行了。利用位运算进行循环移位 *** 作比较容易理解。如果不是循环移位,使用x<<n(左移n位),x>>n右移n位。

参考资料来源:百度百科—循环移位运算

左移时左端高位移出的部分舍弃是啥意思。还有右移时负整数高位补一是啥意思??

解答:正数在存储的时候就是原数字,但是负数要采取补码的方式存储。这样,负数的最高位就是1。比如:对于32位的系统int为四个字节,共32位,数字1就是0xffffffff(即-1的补码,最高位是1)。

对于0xffffffff 已经占满的32个位,左移时,高位全部舍去不要,低位补0比如左移4位就变成 0xfffffff0。但是右移就不一样了,右移时,低位舍去,高位补1,(原来的最高位就是1),所以右移四位还是 0xffffffff ,而不是 0x0fffffff。

这句话的意思就是:

对一个数实施左移 *** 作=对这个数×2;

对一个数实施右移 *** 作=对这个数÷2。

这个是计算机基本的二进制 *** 作,因此不仅仅局限于C语言,

事实上绝大多数计算机编程语言都支持这个 *** 作。

理解很容易:

一个(十进制的)数,在电脑里面都可以按二进制表示。

比如数字8,

二进制就是1000

左移一位,1000

<<

1

=

0001

0000

=

16,

因此就是=8×2;同理右移一位,

1000

>>

1

=

0100

=

4,

就是8÷2

一个十进制a(这里先以正整数为例说明),

总可以表示成:

a

=

a[n-1]2^(n-1)+a[n-2]2(n-2)

+

a[1]2^1

+

a[0]+2^0;

这里a[n-1]a[0]的取值范围就是0或1,就是一个二进制数各个位上权系数。

假设a[i]

<<

k;

a[i]

->

a[i+k];

它对整个数的贡献值,从2^i

->

2^(i+k)

=

2^i

×

2^k,

二进制的每一位都这样 *** 作,因此这个数就被放大了2^k倍。当k=1的时候,就是×2;同理右移就是÷2^k

比较浅显的来说,左移n位就是乘以2的n次方,右移n位就是除以2的n次方。具体细节如下:

C语言里的左移和右移运算

2006-09-30 13:52

先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符例如:

int i = 1;

i = i << 2; //把i里的值左移2位

也就是说,1的2进制是0000001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成 0000100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)

需要注意的一个问题是int类型最左端的符号位和移位移出去的情况我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:

int i = 0x40000000; //16进制的40000000,为2进制的010000000000

i = i << 1;

那么,i在左移1位之后就会变成0x80000000,也就是2进制的1000000000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出如果再接着把i左移1位会出现什么情况呢在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0

左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:

int i = 1, j = 0x80000000; //设int为32位

i = i << 33; // 33 % 32 = 1 左移1位,i变成2

j = j << 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃

在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数>=类型长度那么实际上i,j移动的就是1位,也就是33%32后的余数在gcc下是这个规则,别的编译器是不是都一样现在还不清楚

总之左移就是: 丢弃最高位,0补最低位

再说右移,明白了左移的道理,那么右移就比较好理解了

右移的概念和左移相反,就是往右边挪动若干位,运算符是>>

右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:

int i = 0x80000000;

i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000

就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位

负数10100110 >>5(假设字长为8位),则得到的是 11111101

总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多

以上就是关于循环左移 和循环右移是什么意思啊全部的内容,包括:循环左移 和循环右移是什么意思啊、c 语言不太理解说的右移和左移的情况。能举个例子解释下那吗。就是左移动高位低位。右移无符号。负整数、C语言中,与2乘左移,与2除右移,这个是啥意思,求详细解释!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10114011.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存