一、背景知识  

  整数在内存中是以二进制的形式存在的,而且存的是该整数的补码。最高位代表符号位,正数为0,负数为1

  正数的补码是其二进制本身,负数的补码则是 符号位保持1不变,其他位按位取反再加1,+0和-0的补码相同,都是0。

  负数在进行按位与运算时是以补码形式参与运算。(这个很好理解,因为负数在内存中本身就是以补码存储的)

二、移位运算

  下面介绍三种移位运算,

  首先我们对5作运算。

  5在内存中的存储形式为:0000 0000 0000 0000 0000 0000 0000 0101

  1、左移<<

   符号位会被保留,数值位左移一位,低位补0,变为:

   0000 0000 0000 0000 0000 0000 0000 1010

   得到值为10

  2、右移>>

   符号位会被保留,数值位左移一位,数值位高位补0,变为:

   0000 0000 0000 0000 0000 0000 0000 0010

   得到值为2

  可以看到,左移相当于乘以2,右移相当于除以2,JDK中很多源码都采用了这种写法,效率高而且优雅

  3、无符号右移>>>

   >>>在右移时会将符号位当做数值位处理,一起右移,高位补0

   为了清楚地演示出符号位的变化,以-5为例:

   -5在内存中的存储形式为:1111 1111 1111 1111 1111 1111 1111 1011

   >>>1      后得到:   0111 1111 1111 1111 1111 1111 1111 1101

   值为2147483645,很明显,无论从10进制数值,还是从内存中的存储,都能看出,该值比Integer的最大值小2

   代码如下:

/**
* @Description:
* @projectName:JavaTest
* @see:PACKAGE_NAME
* @author:郑晓龙
* @createTime:2019/5/15 23:30
* @version:1.0
*/
public class ShiftOperationTest {
public static void main(String[] args) {
System.out.println(5<<1);
System.out.println(5>>1);
System.out.println(-5>>>1);
System.out.println(Integer.MAX_VALUE);
}
}

  运行结果:

10
2
2147483645
2147483647

最后,强迫症来了,为什么没有<<<

我认为是这样的:内存中是将整数以二进制的补码形式存放,最高位是符号位,左移时最高位有可能是1或0,符号位不能确定,也就无法满足无符号左移的定义,而右移可以规定高位补0,即可以确保符号位为0。

[JAVA]移位运算(左移<<,右移>>和无符号右移>>>)的更多相关文章

  1. Java负整数的左移、右移、无符号右移

    转自  Java负整数的左移.右移.无符号右移 Java负整数的左移.右移.无符号右移.正数的位移没有涉及到符号,而且正数的原码.反码.补码都是一样的,所以相对简单,但是对于负整数的位移,往往容易混淆 ...

  2. 分析轮子(二)- << ,>>,>> (左移、右移、无符号右移)

    前言:写 分析轮子(一)-ArrayList.java 的时候看到源码中有 int newCapacity = oldCapacity + (oldCapacity >> 1); 这样的代 ...

  3. Java,C 位移运算符 有符号右移>>与无符号右移>>>

    个人博客 地址:https://www.wenhaofan.com/a/20181029232749 有符号右移 正数有符号右移 首先计算4>>2 将4转为二进制 0000 0100 右移 ...

  4. java的<<左移,>>右移,>>>无符号右移

    >>右移 右移,道在二进制中,假设用一个32位的Int表示一个64,那么高位就都是0,所以当我们把整个二进制数右移,如0100000 >> 2 = 0001000,可以看到右移 ...

  5. 原码,反码,补码 与(&) 或(|) 非(~) 异或(^) 左移 << 右移 >> 无符号右移 >>>

    原码 数字在计算机中以二进制表示,8位的字长,最高位是符号位, 正数为0,负数为1.比如,3为0000 0011: -3为1000 0011. 注意,Java中int为32位.3的16进制表示为3,- ...

  6. java移位运算符:<<(左移)、>>(带符号右移)和>>>(无符号右移)。

    1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规 ...

  7. java移位运算符实验程序:&lt;&lt;(左移)、&gt;&gt;(带符 号右移)和&gt;&gt;&gt;(无符号右移)

    public class txs { static void leftbit(){ int i;               //整型长度为32位                           ...

  8. Java 移位运算、符号位扩展

    类型取值范围 short 是1字节,即8位.而且 Java 中只有有符号数,所以最大值 0111,1111=2^7-1. 同时计算机中以补码形式存负数,所以可以多表示一个数,则最小值 1000,000 ...

  9. ABAP语言实现 左移 <<、无符号右移 >>> 位移操作

    这几天要在ABAP中实现 3DES 标准对称加密算法,与其他外部系统进行加密/解密操作.由于ABAP语言中没有 左移 <<.无符号右移 >>>  操作,只能自己实现 思路 ...

随机推荐

  1. ASP.NET Core中间件与HttpModule有何不同

    前言 在ASP.NET Core中最大的更改之一是对Http请求管道的更改,在ASP.NET中我们了解HttpHandler和HttpModule但是到现在这些已经被替换为中间件那么下面我们来看一下他 ...

  2. 聊聊依赖注入注解@Resource和@Autowired

    1. 前言 @Resource和@Autowired注解都可以在Spring Framework应用中进行声明式的依赖注入.而且面试中经常涉及到这两个注解的知识点.今天我们来总结一下它们. 2. @R ...

  3. test for OCr

  4. 2019-02-02 Python学习之多线程

    1.主线程和次线程 若主线程结束则次线程也会结束 如何避免主线程先结束: 结尾处加上 while True: pass e.g. import win32api #引用系统函数 import _thr ...

  5. cb49a_c++_STL_算法_对所有元素排序_sort_stable_sort

    cb49a_c++_STL_算法_对所有元素排序_sort_stable_sort sort(b,e) sort(b,e,p) stable_sort(b,e) stable_sort(b,e,p) ...

  6. jwt 工具类

    public class TokenUtils { private Logger logger = LoggerFactory.getLogger(this.getClass()); /** * 签名 ...

  7. 如何在VMware虚拟机中安装CentOS6.7系统(下篇)

    上一篇文章讲到了CentOS6.7的安装教程,安装步骤到时区选择这块了,这篇文章接上篇文章,继续讲述CentOS6.7的安装教程,直至安装完成. 17.设置root的登录密码,日后登录虚拟机,用户名就 ...

  8. 有趣的程序分析之C

    1. 下面的函数被用来计算某个整数的平方,它能实现预期设计目标吗?如果不能,试回答存在什么问题: 1 2 3 4 int square( volatile int *ptr ) {     retur ...

  9. 谈谈spring-boot-starter-data-redis序列化

    在上一篇中springboot 2.X 集成redis中提到了在spring-boot-starter-data-redis中使用JdkSerializationRedisSerializerl来实现 ...

  10. JavaWeb网上图书商城完整项目--25.注册页面之隐藏没有内容的错误信息实现

    在上一章中我们显示的效果如下所示: 上面后面都有错误的红色×的显示,这样是不对的,我们要解决该问题 我们要循环遍历每一个错误的信息,看它的内容有没有,如果有内容我们就显示错误的×,如果没有就不显示× ...