Java 运算符(位运算符)

在我们平常查看的源码中能够经常的看到使用位运算符,这些位运算符一般只用于整数类型和字符类型的运算,Java 提供的常用位运算符有:

操作符 描述
& 按位与
\ 按位或
~ 按位非
^ 按位异或
>> 右移运算符
<< 左移运算符
>>> 无符号右移运算符

& 按位与

//&(与)运算符的计算规则是 1&1=1 1&0,0&1,0&0 =0 ,只有两位操作数都为1的时候,这两位操作数&(与)运算的结果才为1,否则为0 
//(包括符号位)
int bit1 = 0b011;
int bit2 = 0b110;
System.out.println(bit1&bit2); 
//输出结果为2
  0b010
    &
  0b110
------
  0b010 = 2

| 按位或 仍然以 bit1和 bit2两个操作数为例

//| (或)运算符的计算规则是 1|1, 1|0,0|1 = 1 ,0&0 =0  ,只要有一位操作数是1,那么这两个操作数|(或)运算的结果就为1,否则为0
//符号位也参与运算
System.out.println(bit1|bit2);
//输出结果为6
0b010
   |
0b110
------
 0b110 

**~ 按位非 **~(非)是一个单目运算符,既是对一个操作数进行运算操作

// ~(非)运算规则是 将操作数的每一位都取反(包括符号位)
//(包括符号位)
int bit3 = 0b101;
System.out.println(~bit3);//输出结果为-6
根据~(非)运算规则,非运算是将操作数每一位都取反。
那么 bit3 = 00000000 00000000 00000000 00000101
对 bit3进行取反 ~bit3 = 11111111 11111111 11111111 11111010
很显然根据目前的结果 ~bit3与我们输出的结果-6是不匹配的。

造成上面的结果的原因是:
在计算机中对数值类型的是以二进制补码的形式进行存储和计算的.
这样我们就可以理解了,此时的bit3是以补码的形式在计算机中存储的,因此输出结果还需要将bit3转换成原码输出出来。
正数的原码 = 反码 = 补码
负数的补码 = 原码取反 + 1
负数的原码 =(补码-1)取反
~bit3的符号位为1,代表是一个负数,我们只需要对 bit3(补码)减1再进行取反(不包括符号位)就能得到bit3的原码,也就是输出结果。

~bit3  11111111 11111111 11111111 11111010                                      
                                        -1
------------------------------------------- 
 反码 = 11111111 11111111 11111111 11111001  
 原码 = 反码取反 =  10000000 00000000 00000000 00000110 = -6   

**^按位异或 **

//^(按位异或)相同为0,不同为1 ,包括符号位置

int bit 4 = 5 ;
int bit5 =  5;
System.out.println(bit4^bit5); //输出结果为0
//正如前面计算机内都是以二进制补码存储和计算数值的
bit4  101
bit5  101
---------
      000 //根据^(异或)相同得0,不同的1,计算结果与输出结果相同

>> (右移运算符)

 //a>>b将操作数a向右移动b位 ,空出来的位置使符号位进行填充,正数使用0补位,负数1补位(在 java 中0b 开头代表二进制数据)
//(包括符号位)
我们以 4>>2 ,4>>3,-4>>2 ,-4>>3为例子进行讲解,我们假设操作数类型是 byte 类型,byte 类型默认是8位
//移位后空位常使用符号位进行填充
4(原)= 4(补)= 4(反) = 0b00000100(补)
-4(原)= 0b10000100 -4(反)= 0b11111011 -4(补)=0b11111100
4 >> 2  0b00000100(4的二进制补码)>> 2 = 0b00000001 = 1
4 >> 3  0b00000100 >> 3 = 0b00000000 = 0
-4 >>2  0b11111100(补) >> 2 = 0b11111111 转换成原码等于0b10000001 = -1
-4 >>3  0b11111100(补) >> 3 = 0b11111111 转换成原码等于0b10000001 = -1

<< (左移运算符)

//a<<b将操作数a向左移动b位 (包括符号位),补位和右移不同,空出位置只使用0进行填充,负数求反码的符号位不参与
//(包括符号位)
0b11000000_00000000_00000000_00000000 << 1 向做移动1位结果是0b10000000_00000000_00000000_00000000

>>>(无符号右移)

>>>右移,移动出来的位置全部以0进行补充(包括符号位)
4>>>2  -> 00000100(补) >>> 2 右移高位补0 结果为 00000001
-4 >>> 2 ->0b11111100(补码) >>> 右移高位补0 结果为 00111111

ps:在对操作数进行位移运算时候,系统会对位移大小进行优化。例如:
对一个32位的 int 类型移动34位,如果位移数大于当前类型表示的最大位数,那么系统会34%32 = 2, 位移数是求余的结果,即 4 >> 2 和4 >> 34结果是一样的

在上面的例子我们为了简单,使用了 byte 类型作为操作数,实际中二进制运算 byte 或者 short 都是会转换到 int类型或者更高的类型进行运算的,我们只是为了方便表达,将其假设会按照byte 类型进行运算

例1: byte a = 5; 

5并不是默认就是 byte类型,默认是整形,只是系统会帮我们默认转化为 byte 类型

 例2:byte h = 0b11111111 ; 

如果0b11111111默认是 byte 类型,那么 h = -1,但实际并非如此,0b11111111默认的是 int 类型,它会按照 int 类型进行计算后在赋值给 h 变量,由于0b11111111的范围大于 byte 类型的表示范围,所以编辑器会提示我们进行强制转换,在运行中这回发生位溢出.

补充:
符号位是参与数值运算的.

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

推荐阅读更多精彩内容

  • 位运算符 位运算指的是可以按照二进制,八进制,十六进制进行数据处理。基本上考虑最多的还是二进制。在位运算之中,可以...
    大鱼鱼阅读 233评论 0 0
  • Win7下如何打开DOS控制台? a:开始--所有程序--附件--命令提示符 b:开始--搜索程序和文件--cmd...
    逍遥叹6阅读 1,595评论 4 12
  • 文/盛沅翡翠 要奔波多久,才能和你重逢 在时光的隧道里 云,牵动着跳跃的目光 不再归来。只有心事 泛滥着香味,向你...
    106ebf7e78a0阅读 212评论 6 3
  • 昨天晚上我和老公聊天,我问他:“你觉得儿子是不是和我很不同?他和我有多少不同点?”(我一直以来都不是很喜欢自己,尤...
    annie11888阅读 417评论 0 0
  • 我在家的时候,刘老师一定不会选择孤独的做饭。 比如即便酱油就在她屁股后面的餐柜里,她也要把我从房间里叫过来,给她拿...
    艾譞阅读 368评论 0 1