Java位运算符及二进制常识(转)

一、位运算

二、位移运算

三、二进制数

  以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

转:https://blog.csdn.net/coffeelifelau/article/details/52433653

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • 网站乱码问题我们会经常碰到,大多见于非英文的中文字符或其他字符乱码,而且,这类问题常常是因为编码方式问题,主要原因...
    波段顶底阅读 2,842评论 1 9
  • 概述 在学习位运算之前,先说下几个概念: 机器数:一个数字在计算机中的二进制表达形式就叫做机器数。机器数是有符号位...
    骑着乌龟去看海阅读 2,442评论 1 4
  • 数据在计算机中都是以补码形式存放的,位运算也是以一个数的补码进行运算,结果也自然也是一个补码,这点在分析计算过程时...
    SharpChen阅读 696评论 0 4
  • Today is a nice day!
    某个Betty阅读 161评论 0 0
  • 玮莲 在这个自然繁华的春天里 在这个人们吵着尽享花开的春天里 春风吹来你的名字—— 海子 读着《面朝大海,春暖花开...
    骄阳下的一朵莲阅读 524评论 7 14