java二进制表示形式

java中数字的二进制表示形式称为“有符号的二进制补码”,下面先介绍原码,反码,补码。

编码 计算方法
原码 用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
反码 正数的反码还是等于原码,负数的反码就是他的原码除符号位外,按位取反。
补码 正数的补码等于他的原码,负数的补码等于反码+1

例如,对于4位二进制来说

十进制 原码 反码 补码
4 0100 0100 0100
-4 1100 1011 1100

移位操作符

左操作数 移位操作符 右操作数,移位操作符的运算对象是二进制的“位”。移位操作符只可用来处理整数类型。如果对于char,byte或者short类型的数值进行位移处理,那么在位移进行之前,它们会被转换为int类型,并且得到的结果也是一个int类型的值。位移操作符有个需要注意的点,在下面会介绍到。位移操作符可分为以下三种:

左移位操作符(<<)

左移位操作符(<<):按照右操作数指定的位数将左操作数向左移动(在低位补0)

public class Example{
public static void main(String[] args) {
int a = Integer.MAX_VALUE;
System.out.println("十进制:" + a + " 二进制:" + Integer.toBinaryString(a));
System.out.println("十进制:" + (a <<2) + " 二进制:" + Integer.toBinaryString(a <<2));
a = Integer.MIN_VALUE;
System.out.println("十进制:" + a + " 二进制:" + Integer.toBinaryString(a));
System.out.println("十进制:" + (a <<2) + " 二进制:" + Integer.toBinaryString(a <<2));
}
}

输出结果:

十进制:2147483647 二进制:1111111111111111111111111111111
十进制:-4 二进制:11111111111111111111111111111100
十进制:-2147483648 二进制:10000000000000000000000000000000
十进制:0 二进制:0
  1. 上面第一行的二进制共31位(理论为01111111111111111111111111111111,共32位,高位0未打印,下面的类似),这是int类型的最大值。
  2. 第二行是Integer.MAX_VALUE经过左移2位后的结果,二进制共32位,首位为1,代表负数。
  3. 第三行二进制共32位,对应的十进制是Integer.MIN_VALUE。
  4. 第四行是Integer.MIN_VALUE经过左移2位后的结果,高2位被移除,末尾补0,得到32位0。

“有符号”右移位操作符(>>)

“有符号”右移位操作符(>>):按照有操作数指定的位数将左操作数向右移动。“有符号”右移操作符使用“符号扩展”:若符号为正,则在高位插入0;若符号为负,则在高位插入1。

public class Example{
public static void main(String[] args) {
int a = Integer.MAX_VALUE;
System.out.println("十进制:" + a + " 二进制:" + Integer.toBinaryString(a));
System.out.println("十进制:" + (a >>2) + " 二进制:" + Integer.toBinaryString(a >>2));
a = Integer.MIN_VALUE;
System.out.println("十进制:" + a + " 二进制:" + Integer.toBinaryString(a));
System.out.println("十进制:" + (a >>2) + " 二进制:" + Integer.toBinaryString(a >>2));
}
}

输出结果:

十进制:2147483647 二进制:1111111111111111111111111111111
十进制:536870911 二进制:11111111111111111111111111111
十进制:-2147483648 二进制:10000000000000000000000000000000
十进制:-536870912 二进制:11100000000000000000000000000000
  1. 第一行和第三行与上面一样。
  2. 第二行二进制共29位,Integer.MAX_VALUE向右移2位,因为符号为正数,高位插入0。
  3. 第四行二进制共32位,Integer.MIN_VALUE向右移2位,因为符号为负数,高位插入1。

“无符号”右移位操作符(>>>)

“无符号”右移位操作符(>>>):使用“零扩展”,无论正负,都在高位插入0。

public class Example{
public static void main(String[] args) {
int a = Integer.MAX_VALUE;
System.out.println("十进制:" + a + " 二进制:" + Integer.toBinaryString(a));
System.out.println("十进制:" + (a >>>2) + " 二进制:" + Integer.toBinaryString(a >>>2));
a = Integer.MIN_VALUE;
System.out.println("十进制:" + a + " 二进制:" + Integer.toBinaryString(a));
System.out.println("十进制:" + (a >>>2) + " 二进制:" + Integer.toBinaryString(a >>>2));
}
}

输出结果:

十进制:2147483647 二进制:1111111111111111111111111111111
十进制:536870911 二进制:11111111111111111111111111111
十进制:-2147483648 二进制:10000000000000000000000000000000
十进制:536870912 二进制:100000000000000000000000000000
  1. 第1,2,3行与上面相同。
  2. 第四行二进制共30位,Integer.MIN_VALUE向右移2位,在高位补0(0没显示)。

注意

《Java编程思想》:只有数值右端的低5位才有用。这样可防止我们移位超过int类型值所具有的位数。(译注:因为2的5次方为32,而int类型值只有32位。)若对于一个long类型的数值进行处理,最后得到的结果也是long,此时只会用到数值右端的低6位,以防止位移超过long型数值具有的位数。

这是什么意思?对于移位操作:左操作数 移位操作符 右操作数。在Java中int类型大小为32bits,long类型大小为64bits。Java不允许一次位移操作移动左操作数的所有位,也就是说int类型的左操作数最多只能移动31位,long类型的左操作数只能移动63位。31对应的二进制为11111共5位,63对应的二进制为111111共6位。左操作数位int型,如果右操作数为32(二进制100000共6位),那么只取低5位,也就是00000,结果就是没变化。

public class Example{
public static void main(String[] args) {
int a = Integer.MIN_VALUE;
System.out.println("十进制:" + a + " 二进制:" + Integer.toBinaryString(a));
System.out.println("十进制:" + (a >>1) + " 二进制:" + Integer.toBinaryString(a >>1));
System.out.println("十进制:" + (a >>31) + " 二进制:" + Integer.toBinaryString(a >>31));
System.out.println("十进制:" + (a >>32) + " 二进制:" + Integer.toBinaryString(a >>32));
System.out.println("十进制:" + (a >>33) + " 二进制:" + Integer.toBinaryString(a >>33));
}
}

输出结果:

十进制:-2147483648 二进制:10000000000000000000000000000000
十进制:-1073741824 二进制:11000000000000000000000000000000
十进制:-1 二进制:11111111111111111111111111111111
十进制:-2147483648 二进制:10000000000000000000000000000000
十进制:-1073741824 二进制:11000000000000000000000000000000
  1. 第一行为Integer.MIN_VALUE。
  2. 第二行将Integer.MIN_VALUE右移1位,高位空出1位,补为1。
  3. 第三行将Integer.MIN_VALUE右移31位,高位空出31位,补为1,得到32位1,对应十进制-1。
  4. 第四行由于右操作数为32,低5位为00000,所以结果与第一行相同。
  5. 第五行由于右操作数为33,低5位为00001,结果和第二行相同。

java二进制表示形式与移位操作符的更多相关文章

  1. Java 逻辑运算符、位运算符、移位操作符 总结(Java 学习中的小记录)

    Java 逻辑运算符.位运算符.移位操作符  总结     作者:王可利(Star·星星) 逻辑运算符,表格如下: 解析逻辑运算符表: 1.与 (&) 特点:两个都为真的时候,结果为真.两个为 ...

  2. 【关于Java移位操作符&按位操作符】

    一.java按位运算符(操作符) 这段时间偶尔看一下源码,会发现有很多很基础的java知识在脑海中已经慢慢的淡成不常用记忆,于是打算捡起来一些. 按位运算符是来操作整数基本数据类型中的单个“比特”(b ...

  3. java 二进制、位运算、和移位运算符(2013-07-30-bd 写的日志迁移

    二进制是逢2进位的进位制,0.1是基本算符, 1字节=8位 比如 int a =1 ;int 占4个字节在计算机里表示为: java中的4个位运算,分别是“按位与&.按位或|.按位异或^,按位 ...

  4. java中的进制与操作符

    直接常量 double: 111d,111D 二进制:前缀为0b 十六进制:前缀为0x或0X,后面最大9位. 八进制:前缀为0,后面最大7位. 按位操作符 与(&): 或(||): 异或(^) ...

  5. Java二进制指令代码解析

    http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html http://blog.csdn.net/sum_rain/article/ ...

  6. java中Integer包装类的具体解说(java二进制操作,全部进制转换)

    程序猿都非常懒,你懂的! 今天为大家分享的是Integer这个包装类.在现实开发中,我们往往须要操作Integer,或者各种进制的转换等等.我今天就为大家具体解说一下Integer的使用吧.看代码: ...

  7. Java之路(二) 操作符

    操作符比较简单,这里只点一下注意事项和要点,请牢记. 操作符接受一个或多个参数,并生成一个新值. Java中,几乎所有的操作符都只能操作基本类型. 例外是 = == 和 !=,它们可以操作所有的对象. ...

  8. Java二进制兼容性原理

    一.概述 现在的软件越来越依赖于不同厂商.作者开发的共享组件,组件管理也变得越来越重要.在这方面,一个极其重要的问题是类的不同版本的二进制兼容性,即一个类改变时,新版的类是否可以直接替换原来的类,却不 ...

  9. C语言的移位操作符及位运算

    C语言的移位操作符 位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算.位移位运算符分为左移和右移两种,均为双目运算符.第一运算对象是移位对象,第二个运算对象是所移的二进制位数. 位 ...

随机推荐

  1. idea 项目启动console卡在Connected to the target VM, address: '127.0.0.1:51140', transport: 'socket'不动了

  2. vue :没有全局变量的计数器

    created: created () { let num = null this.mFun(num) }, methods: methods:{ mFun(m){ if (m === null) { ...

  3. python怎么自学?今日头条技术大佬的真实经历分享

    大家好,我是武州,27岁,目前在字节跳动担任Python后端工程师一职. (摆拍一下,假装是保安) 在开始今天的文章之前,不知道你们有没有遇到过这样的问题: 大学没学到什么实质技术,毕业后找不到高薪的 ...

  4. Java实现简单的增删改查操作

    需求分析:通过数组 ,完成 对学生信息的 管理 (增删改查)创建1个 学生类创建1个 CRUD的类 – 学生管理类 并测试 在这个程序中我只运用了两个类进行操作 package com.hopu.de ...

  5. python处理文本数据

    处理文本数据,主要是通过Seris的str访问.遇到NaN时不做任何处理,保留结果为NaN,遇到数字全部处理为NaN. str是Seris的方法,DataFrame不能直接使用,但是通过索引选择Dat ...

  6. CSV文件指定页脚

    https://www.cnblogs.com/zhangxinqi/p/9231801.html 2020-06-15

  7. Django学习路25_ifequal 和 ifnotequal 判断数值是否相等及加减法 {{数值|add 数值}}

    {% ifequal 数值 数值 %} <body> {# 判断是否相等 #} num 当前的值 {{ num }}<br/> {% ifequal num 5 %} {# 判 ...

  8. PHP array_udiff_uassoc() 函数

    实例 比较两个数组的键名和键值(使用用户自定义函数进行比较),并返回差集: <?phpfunction myfunction_key($a,$b){if ($a===$b){return 0;} ...

  9. PHP chop() 函数

    实例 移除字符串右侧的字符: <?php$str = "Hello World!";高佣联盟 www.cgewang.comecho $str . "<br& ...

  10. Skill 脚本演示 ycCommonCenterMos.skl

    https://www.cnblogs.com/yeungchie/ ycCommonCenterMos.skl 自动生成一个共质心差分对 Mos ,可以自定布局类型. 回到目录