Java的按位操作符

时间:2021-02-27 17:47:23

1.按位操作符概述

按位操作符,以单个“比特”(bit),即二进制位来操作整数。按位操作符有:异或(^)、与(&)、或(|)、非(~)。按位“非”(~),也称为取反操作符,他属于一元操作符,只对一个操作数进行操作(其他按位操作符是二元操作符,如:,因此他们可以这样写:&=、|=、^=效果类似于+=)。

2.按位操作符计算

分别对二进制补码有如下计算:
&:两个数输入位都是1,则输出1,否则输出0,如10&11=10;
|:两个数输入位都是0,则输出0,否则输出1,如:10|00=10;
^:两个数输入位不一样,则输出1,一样则输出0,如:10^00=10;
~:输入数为1就输出0,输入数为0就输出1,如:~10=01。
这里有一个公式,可以快速的得到非运算的结果:
~n=-n-1
下面讲解一下非运算的计算方法:
在计算机系统中,数值一律用补码来表示和存储,例如数字5,在计算机中保存为大小为这样的补码:0101,实际上这个补码前面还有很多0,但是对计算无用,这里省略,非运算就是将这个补码每位取反,得到这样一个补码:1010,转换成它的真值:-6,恰好符合之前的那个公式:~5=-5-1=6。
一般说来,计算这些按位操作符(或,与、非、异或、非)时,都可以通过以下步骤计算:
十进制->二进制->二进制原码->二进制补码->进行按位操作->按位操作后的二进制补码->二进制原码->二进制->十进制的结果
下面讲一下原码和补码:
原码的编码规则:
最高位为符号位(正数为0,负数为1),其余各数值位取二进制原值不变。
表示形式如下:
正数:
Java的按位操作符

负数:
Java的按位操作符

原码和补码的转换公式(都是二进制形式):
对于正数
[X]补=[X]原 (即X≥0时)
对于负数
符号位仍为“1”(即符号位不变),各数值位“按位取反,末位再加1”,即:
[X]补= [X]反+1 (即X<0时)

3.按位操作符计算例子

这里给两个例子:
~2=-3
2->10(二进制)->010(原码)->010(补码)->非运算->101(补码)->111(原码)->-11(二进制)->-3(十进制)
-5^2=-7:
-5->-101(二进制)->1101(原码)->1011(补码)
2->010(二进制)->0010(原码)->0010(补码)
1011异或0010 结果为1001
1001(补码)->1111(原码)->-111(二进制)->-7(十进制)