Java位运算符详解

Java中所支持的位运算符一共有7个
&:按位与。当两位同时为1时才返回1。
|:按位或。只要有一位为1即可返回1。
~:按位非。单目运算符,将操作数的每个位(包括符号位)全部取反。
^:按位异或。当两位相同时返回0,不同时返回1。
<<:左移运算符。
>>:右移运算符。
>>>:无符号右移运算符。
注(上面所说的两位相同,指的是参与运算的两位整数的补码,也就是存储在计算机中的形式)

一般来说,位运算符只能操作整数类型的变量或值。

要想搞清楚这几个运算符是如何运算的,首先要弄明白几个概念。
我们知道数据在计算机中的存储形式都是二进制,整数自然也是这样。
这里涉及几个概念

原码、反码、补码。

原码就是将数字转换成二进制。
反码就是将原码的每位取反(如果是0,那就变成1。如果是1,那就变成0。符号位不变)。
补码就是在反码的基础上+1。

原码其实就是为了方便人类去看,补码是数字在计算机中存在的形态。
所以上面我们所说的运算符其实都是对数字的补码进行运算。
不太明白的请看这里关于原码,反码,补码的介绍

下面举个例子(我们用8位来表示,最前面一位表示符号位)
int a = 3;
原码:0000 0011
反码:0000 0011
补码:0000 0011
发现没,正数的原码,反码,补码都是一样的。其实反码跟补码都是为负数设计的。
int b = -3;
原码:1000 0011
反码:1111 1100
补码:1111 1101
可以看到,负数的原码到反码是各位取反(这里说的取反就是0变1,1变0)符号位不变。
反码到补码直接+1;

& 同为1则为1 否则为0

举个栗子:
5&9
5 补码 0000 0101
9 补码 0000 1001
结果 0000 0001
也就是1;

| 一位为1 则返回1

5|9
5 补码 0000 0101
9 补码 0000 1001
结果 0000 1101
也就是13;

~ 将操作数的每位取反

~-5
-5 补码 1111 1011
取反 0000 0100
结果也就是4;

^ 两位相同时返回0,不同时返回1

5^9
5 补码 0000 0101
9补码 0000 1001
结果 0000 1100
也就是12;

<<:左移运算符 将操作数的二进制码整体左移指定位数,右边空出的以0填充

-5<<2
首先算出-5的补码
1111 1011
左移两位 1110 1100 (将前面两位砍掉,整体左移,后面增加两位0。)
现在得到的是补码。
我们还要将补码转为原码。
其实就是原码->补码的反过程
先-1得到反码
1110 1011
然后取反得到原码
1001 0100
结果
-20;

>>:右移运算符 将操作数的二进制码整体右移指定位数,左边空出的以符号位填充(如果是正数,就是以0填充。如果是负数,就是以1填充。)

-5>>2
-5的补码
1111 1011
右移两位得到
1111 1110
再转为原码
1000 0010
结果
-2;

>>>无符号右移运算符 将操作数的二进制码整体右移指定位数,左边空出来的位总是以0填充。

-5>>>2
1111 1011
右移两位,空出来的以0填充,所以得到的结果总是正数
0011 1110
而且大的惊人 2的30次方-2 1073741822;

注 关于移位运算还要遵循以下几个规则
对于低于Int类型(如byte、short、char)的操作数总是先自动类型转换为int类型后再移位。
对于Int类型的整数移位a>>b,当b>32时,系统会用b对32求余(因为int类型只有32位),得到的结果才是真正移位的位数。例如,a>>33和a>>1的结果是完全一样的,而a>>32和a相同。
对于long类型的整数移位a>>b,当b>64时,总是先用b对64求余(因为long类型是64位),得到的结果才是真正移位的位数。
当进行位移运算时,只要被移位的二进制码没有发生有效位的数字丢失(对于正数而言,通常指被移出的位全部都是0),可以发现左移n位就相当于乘以2的n次方,右移n位则是除以2的n次方。不仅如此,进行移位运算不会改变操作数本事,只是得到了一个新的运算结果,而原来操作数本事是不会改变的。

ok,到此7种位运算符介绍完毕,虽然我们平时工作开发中可能不怎么用到,但是在看源码的时候,你会发现里面好多地方都在用这些运算符,所以弄清楚了有助于我们去看懂别人的代码。
如果有什么不对的地方,还望帮忙指正,以免误导他人。

参考资料(疯狂JAVA讲义第三版)

链接:https://www.jianshu.com/p/59dd834de07d

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

推荐阅读更多精彩内容