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. 简易防止U盘中毒

    1.将U盘插入电脑,打开u盘 2.在U盘里面新建一个文本文档,将文本文档重命名autorun.inf保存完成. 3.为了防止误删次文件可以将属性设为影藏,就完成了.

  2. Active Directory - Server Remote administration management

    Windows Admin Center: https://www.microsoft.com/en-us/evalcenter/evaluate-windows-admin-center Remot ...

  3. lua的table表去重

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321  我的个人博客 方法一 用过lua的人都知道,lua的table中不允许存在相同的key,利用这个思想,我们可以将原始table ...

  4. pyinstall打包资源文件

    相关代码 main.py import sys import os #生成资源文件目录访问路径 #说明: pyinstaller工具打包的可执行文件,运行时sys.frozen会被设置成True # ...

  5. 一些matlb会用到的函数

    matlab这种软件功能很强大,但是都不是常常会用到,尤其是像在学生中.每次用的时候总会把一些基本的函数忘记,还的去网上查.我之前在使用的时候也总结过,可惜在一次数据丢失中全没了(︶︹︺). 从现在开 ...

  6. OFDM通信系统的MATLAB仿真(2)

    关于OFDM系统的MATLAB仿真实现的第二篇随笔,在第一篇中,我们讨论的是信号经过AWGN信道的情况,只用添加固定噪声功率的高斯白噪声就好了.但在实际无线信道中,信道干扰常常是加性噪声.多径衰落的结 ...

  7. java排序方式对比

    尽量使用使用Comparator进行排序, 在java中,要想给数据进行排序,有两种事项方式, 一种为实现Comparable接口, 一种是实现Comparator接口, public interfa ...

  8. RecyclerView设置空视图

    RecyclerView貌似不能直接设置空视图,所以可以自定义一个RecyclerView继承自RecyclerView并设置一个数据监听者监视数据状态. MyCyclerView.java pack ...

  9. Spring+hibernate+JSP实现Piano的数据库操作---4.配置文件

    1.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...

  10. nonlocal 访问变量

    def counter(start = 0): def incr(): nonlocal start #分别保存每一个变量的临时值.类似yield start += 1 return start re ...