一、位运算

二、位移运算

三、二进制数

以Java中最常使用的int类型为例(32位)。

㈠ 符号位

二进制数最左端的数字为符号位:0代表正,1代表负。

㈡ 最大与最小

⑴  1是最小的正整数,符号位为0,最后一位为1,其它全部为0。

递增:二进制数右端每次加1(逢2进1),一直到31个非符号位的0全部变为1,得到最大的正整数2147483647。

⑵ -1是最大的负整数,符号位为1,其它31位也全部为1。

递减:二进制数右端每次减1(逢0借1),一直到31个非符号位的1全部变成0,得到最小的负整数为-2147483648。

㈢ 原码、补码、反码

⑴ 原码

根据数学上的表示习惯:“+”代表为正数,只要将“+”变为“-”,那么就是对应的负数。譬如 +1 对应的负数为 -1。

根据这个原则,二进制数的负数表示本来应该如下图:

以正数的二进制数表示为基准,负数的表示只改变符号位,这样的表示方式就是原码。因此,正数的表示方式都是原码。

事实上的二进制的负数并不是如上面的原码这样表示,譬如-1是32个1。那么这样的表示方式是如何得到的呢?

⑵ 反码

反码就是将原码除符号位以外的值全部取反,原来是1的变为0,原来是0的变为1。例如使用-1的原码得到的反码如下图所示:

⑶ 补码

补码就是在反码的基础上,在二进制数的右端末位加1(逢2进1)。如下图所示:

对比本节开始的图,你会发现补码的32个1正是十进制表示的 -1。

原码、反码和补码都是计算机的定点表示法。事实上,当前的绝大多数计算机使用的都是补码表示法,虽然历史上曾经生产过反码表示的计算机。

C语言标准没有明确规定必须使用补码表示法,Java则明确规定了必须使用补码表示法。

⑷ 总结

正数的原码和反码和补码都一致;负数的原码是正数的符号位取反;负数的反码是原码的非符号位取反;负数的补码是反码加1。

但,使用补码表示有何好处呢?

㈣ 补码的好处

以 +1 和 -1 作加法运算为例,如下图所示:

相信你已经发现,1 + (-1) 这样的加法运算只要将二进制数相加,然后-1的末位就会变成2,根据逢2进1机制,从右至左依次所有位都会变成0。

最后,最左端的符号位也会进位1变成0,丢弃溢出的1,就得到最后的结果0的二进制表示32个0。

对照本节开头的图,会发现所有的减法都可以转换成二进制位的加法运算:1-2 可以转换成1+(-2),(-1)-(-2)可以转换成-1+2……

这跟数学中的表示是一样的,而且非常地方便计算(很多计算机科学家都是从数学领域转入计算机工程,所以在很多细微之处的都能见到数学的影子)。因此,现代计算机硬件结构实际上只设计了加法器,大部分的减法其实都是转换成加法后再运算。

四 小技巧

⑴ 乘法除法:n * 2 等价于 n << 1; n * 5 等价于 n << 2 + 1; n / 2 等价于 n >> 1。

备注:JVM执行时会自动转化,大部分其它高级语言的编译器会做类似优化转换,所以除非有特殊的理由,否则别这么写。

⑵ 取低位:n & 0x0000FFFF;取高位:n & 0xFFFF0000。

⑶ 奇偶判断:n & 1,等于0为偶,等于1为奇。

⑷ 正负判断:(n >>> 31) & 1,等于0为正,等于1为负。

⑸ 取余:n % m ,如m为2的幂次方,可用(n & (m - 1))替代。

…………

网上有很多类似的小技巧,有兴趣的读者可以自行搜索。

本文简单了介绍二进制的基本常识,希望能帮助大家在阅读源码、学习汇编和操作系统等底层原理时能更好地理解内容,与及帮助下那些在学习原码、反码、补码时被很多博客或者资料绕得云里雾里的人们。

最后,如有错误之处请务必指正,谢谢!

参考资料:

《深入理解计算机系统》Randal E.Bryant  David R.O’Hallaron

Java二进制的符号位在哪一位_Java位运算符及二进制常识相关推荐

  1. java符号位_java 位运算符号

    <道生一,一生二,二生三,三生万物>出自老子的<道德经>第四十二章.主要讲述了一.二.三这几个数字,并不把一.二.三看作具体的事物和具体数量.它们只是表示"道&quo ...

  2. java 无符号运算_java位运算和无符号运算

    计算机在底层使用的是二进制补码进行运算. 计算规则: 正数的原码.反码.补码是其二进制本身. 负数的原码首先计算其二进制数,然后最高位使用1表示负数,反码是最高位不变其它位取反,补码是在反码的基础上进 ...

  3. java中无符号类型的处理[转]

    在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换. 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stre ...

  4. java平移变换_java移位运算符:(左移)、(带符号右移)和(无符号右移)。...

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

  5. java 位运算符在实际开发中的用处_java 位运算 和实际应用

    public class Test { public static void main(String[] args) { // 1.左移( < // 0000 0000 0000 0000 00 ...

  6. day017:Java进制转换、原码反码补码、位运算、位移运算符

    一.进制介绍: 1.进制:指进位制,表示某一位置上的数,运算时是逢X进一. 十进制就是逢十进一,二进制就是逢二进一,八进制就是逢八进一. 2.Java中默认的数值都是十进制,如果要输入其他进制,在数值 ...

  7. java取余位运算_java位运算

    位移动运算符: < 例如:3 <<2(3为int型) 1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011, 2)把该数字高位(左侧 ...

  8. java右移位怎么算_Java移位运算符

    一 描述 < >>:右移运算符(算术右移),如果数字为正数时,移位后在前面补0,为负数时,则在前面补1: >>>:无符号右移运算符(逻辑右移),忽略符号,空位补0即 ...

  9. java int 运算符_Java 位运算符和 int 类型的实现

    Java 位运算符和 int 类型的实现 其他运算符 # 算术运算符 +.-.*./.++i.i++.--i.i-- # 关系运算符 ==.!=.>.=.<= # 逻辑运算符 && ...

  10. java short 无符号_Java 表示无符号整数

    在 java 中,所有的数字都是有符号的,即可以表示负数,也可表示正数,如:byte.short.int.long.float 和 double).例如:byte,长度为8位:如果是无符号的,则可以表 ...

最新文章

  1. hive-数据倾斜记录分享
  2. 沪深300股指期权和上证所深交所上市的两个沪深300ETF期权的区别
  3. 【转】自然语言系列学习之表示学习与知识获取(四)TransE
  4. AlexNet网络构建与训练
  5. labview求n阶乘的和_求极限方法总结
  6. 环信SDK 踩坑记webIM篇(三)
  7. .Net WinForm 启用XP效果的问题
  8. 组策略同步的频率和设置修改
  9. python中split的用法-python中的split()函数的用法
  10. 解锁新招:冷冻手机窃密数据
  11. java web 部署_一步一步将java web项目部署到云服务器
  12. 商务办公软件应用与实践【9】
  13. 桌面计算机图标无法显示属性,Win7系统桌面图标显示异常的解决方法大全
  14. c:\windows\ ntdetect failed
  15. 树莓派开启SSH、VNC远程桌面、开启root账号以及换国内镜像源码等
  16. Python 实验1-8
  17. 关于 Adobe PDF虚拟打印机
  18. 我与我的专业计算机作文500字,电脑走进我的生活作文500字
  19. USB Mass Storage 6.7 The Thirteen Cases章节的理解
  20. 【让安卓手机快速接通笔记本WIFI的小技巧】

热门文章

  1. 有关计算机学的心得体会,关于计算机学习心得体会大全
  2. asp.net中配置使用Sqlite轻型数据库
  3. Windows下对文件做MD5校验
  4. html格式转换wps表格,用WPS Office轻松实现教案格式转换
  5. 5分钟实战QQ机器人教程(保姆级)
  6. 嵌入式linux设计报告,嵌入式Linux程设计报告.doc
  7. 破解百度空间、新浪相册、网易、搜狐等博客图片防盗链的方法
  8. 计算机什么应用函数计算,函数计算器软件
  9. Redis设计与实现读后感
  10. 重磅!清华大学网上课程面向全国免费开放!无需登录、注册!在家上清华!...