java二进制表示形式与移位操作符
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
- 上面第一行的二进制共31位(理论为01111111111111111111111111111111,共32位,高位0未打印,下面的类似),这是int类型的最大值。
- 第二行是Integer.MAX_VALUE经过左移2位后的结果,二进制共32位,首位为1,代表负数。
- 第三行二进制共32位,对应的十进制是Integer.MIN_VALUE。
- 第四行是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
- 第一行和第三行与上面一样。
- 第二行二进制共29位,Integer.MAX_VALUE向右移2位,因为符号为正数,高位插入0。
- 第四行二进制共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,2,3行与上面相同。
- 第四行二进制共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
- 第一行为Integer.MIN_VALUE。
- 第二行将Integer.MIN_VALUE右移1位,高位空出1位,补为1。
- 第三行将Integer.MIN_VALUE右移31位,高位空出31位,补为1,得到32位1,对应十进制-1。
- 第四行由于右操作数为32,低5位为00000,所以结果与第一行相同。
- 第五行由于右操作数为33,低5位为00001,结果和第二行相同。
java二进制表示形式与移位操作符的更多相关文章
- Java 逻辑运算符、位运算符、移位操作符 总结(Java 学习中的小记录)
Java 逻辑运算符.位运算符.移位操作符 总结 作者:王可利(Star·星星) 逻辑运算符,表格如下: 解析逻辑运算符表: 1.与 (&) 特点:两个都为真的时候,结果为真.两个为 ...
- 【关于Java移位操作符&按位操作符】
一.java按位运算符(操作符) 这段时间偶尔看一下源码,会发现有很多很基础的java知识在脑海中已经慢慢的淡成不常用记忆,于是打算捡起来一些. 按位运算符是来操作整数基本数据类型中的单个“比特”(b ...
- java 二进制、位运算、和移位运算符(2013-07-30-bd 写的日志迁移
二进制是逢2进位的进位制,0.1是基本算符, 1字节=8位 比如 int a =1 ;int 占4个字节在计算机里表示为: java中的4个位运算,分别是“按位与&.按位或|.按位异或^,按位 ...
- java中的进制与操作符
直接常量 double: 111d,111D 二进制:前缀为0b 十六进制:前缀为0x或0X,后面最大9位. 八进制:前缀为0,后面最大7位. 按位操作符 与(&): 或(||): 异或(^) ...
- Java二进制指令代码解析
http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html http://blog.csdn.net/sum_rain/article/ ...
- java中Integer包装类的具体解说(java二进制操作,全部进制转换)
程序猿都非常懒,你懂的! 今天为大家分享的是Integer这个包装类.在现实开发中,我们往往须要操作Integer,或者各种进制的转换等等.我今天就为大家具体解说一下Integer的使用吧.看代码: ...
- Java之路(二) 操作符
操作符比较简单,这里只点一下注意事项和要点,请牢记. 操作符接受一个或多个参数,并生成一个新值. Java中,几乎所有的操作符都只能操作基本类型. 例外是 = == 和 !=,它们可以操作所有的对象. ...
- Java二进制兼容性原理
一.概述 现在的软件越来越依赖于不同厂商.作者开发的共享组件,组件管理也变得越来越重要.在这方面,一个极其重要的问题是类的不同版本的二进制兼容性,即一个类改变时,新版的类是否可以直接替换原来的类,却不 ...
- C语言的移位操作符及位运算
C语言的移位操作符 位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算.位移位运算符分为左移和右移两种,均为双目运算符.第一运算对象是移位对象,第二个运算对象是所移的二进制位数. 位 ...
随机推荐
- idea 项目启动console卡在Connected to the target VM, address: '127.0.0.1:51140', transport: 'socket'不动了
- vue :没有全局变量的计数器
created: created () { let num = null this.mFun(num) }, methods: methods:{ mFun(m){ if (m === null) { ...
- python怎么自学?今日头条技术大佬的真实经历分享
大家好,我是武州,27岁,目前在字节跳动担任Python后端工程师一职. (摆拍一下,假装是保安) 在开始今天的文章之前,不知道你们有没有遇到过这样的问题: 大学没学到什么实质技术,毕业后找不到高薪的 ...
- Java实现简单的增删改查操作
需求分析:通过数组 ,完成 对学生信息的 管理 (增删改查)创建1个 学生类创建1个 CRUD的类 – 学生管理类 并测试 在这个程序中我只运用了两个类进行操作 package com.hopu.de ...
- python处理文本数据
处理文本数据,主要是通过Seris的str访问.遇到NaN时不做任何处理,保留结果为NaN,遇到数字全部处理为NaN. str是Seris的方法,DataFrame不能直接使用,但是通过索引选择Dat ...
- CSV文件指定页脚
https://www.cnblogs.com/zhangxinqi/p/9231801.html 2020-06-15
- Django学习路25_ifequal 和 ifnotequal 判断数值是否相等及加减法 {{数值|add 数值}}
{% ifequal 数值 数值 %} <body> {# 判断是否相等 #} num 当前的值 {{ num }}<br/> {% ifequal num 5 %} {# 判 ...
- PHP array_udiff_uassoc() 函数
实例 比较两个数组的键名和键值(使用用户自定义函数进行比较),并返回差集: <?phpfunction myfunction_key($a,$b){if ($a===$b){return 0;} ...
- PHP chop() 函数
实例 移除字符串右侧的字符: <?php$str = "Hello World!";高佣联盟 www.cgewang.comecho $str . "<br& ...
- Skill 脚本演示 ycCommonCenterMos.skl
https://www.cnblogs.com/yeungchie/ ycCommonCenterMos.skl 自动生成一个共质心差分对 Mos ,可以自定布局类型. 回到目录