【数据结构与算法篇】 位移运算(“<<”和“>>”)详解

【数据结构与算法篇】 位移运算(“<<”和“>>”)详解本文只概述 和 其余可参考 位运算总结 超全解释及代码演示 南斋孤鹤的博客 CSDN 博客 左移 lt lt 首先 我们要明白一件事

大家好,我是讯享网,很高兴认识大家。

本文只概述“<<”和“>>”其余可参考:

 位运算总结(超全解释及代码演示)_南斋孤鹤的博客-CSDN博客


左移("<<"):

首先:我们要明白一件事:位移运算我们操作的对象是二进制数,也就是说位移运算是在二进制数上操作的;怎么证明呢?

下图是我在百度搜索的(足以够证明吧!!!): 


讯享网

"<<"的作用:

        "<<"是用来将一个二进制数的各个二进制位全部左移若干位(右面补0)那么这句话如何理解呢?下面例说明:

例1、"1<<2":首先我们要写出1的二进制数;1的二进制数就是00000001,各个二进制位左移两位后得到的二进制数就是00000100,100对应的十进制就是各个位置的数乘以他的权重,如下图:所以1<<2=4;

例2、"3<<2":首先我们要写出3的二进制数;3的二进制数就是00000011,各个二进制位左移两位后得到的二进制数就是00001100,1100对应的十进制就是各个位置的数乘以他的权重,如下图:所以3<<2=12; 

总结:

我们从以上的步骤中,可以总结出,

技巧:左移1位相当于在该数乘以2,左移2位相当于该数乘以2*2

(绝大多数情况下可以这样快捷运算,)。

但是

这个技巧并不是总是成立,例如:溢出

   左移和右移运算过程中发生溢出,移位位数并不是可以任意。当移位位数超过该数值类型的最大位数时,编译器会用移位位数去模该类型位数,然后按照余数进行移位。

例如:左移溢出

{ int i=1; i=i<<33; System.out.println(i); } 结果: 2

讯享网

左移变量为33,变量i为32位,故左移位数实际为:33%32=1,也就是相当于移了一位,结果为2

右移(">>"):(注意符号

">>"的作用:

上文我们明白了左移,呢么顾名思义右移就是向右移动两位,最左面补0了呗?

如果你这样认为呢就错了,你忽略了同一个十进制数的负值和正值的区别了!

注:右移时,对于无符号数左边高位补0;对于有符号数,若原来符号位为0(该数为正),则左边也补0。若符号位原来为1(即负数),则高位补1。

总结:

技巧:右移1位相当于除以2,右移n位相当于除以2的n次方

同样这个技巧也是有特殊情况的,不过大多数情况下是可以这样认为的。
 

小讯
上一篇 2025-02-08 10:04
下一篇 2025-04-08 07:41

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/40758.html