1、什么是二进制位

  二进制位简称“位”,是二进制记数系统中表示小于 2 的整数的符号,一般用 1 或 0 表示,是具有相等概率的两种状态中的一种。二进制位的位数可表示一个机器字的字长,一个二进制位包含的信息量称为一比特。

2、原码,反码,补码

1)原码

  原码可直观反映出数据的大小,最高位为符号位(0 正,1 负),其余各位以数值本身的绝对值。

2)反码

  反码解决负数加法运算问题,将减法运算转换为加法运算,从而简化运算规则。正数和原码相同,负数符号位为 1,其余为对原码取反。

3)补码

  补码解决负数加法运算正负零问题,弥补了反码的不足。正数和原码相同,负数符号位为 1,其余为对原码取反,再加 1。

4)例子

123 转为二进制为:01111011
负数的原码按照绝对值转为二进制后,最高位补 1。

十进制数原码反码补码
123011110110111101101111011
-123111110111000010010000101

3、Java 中按位运算符

  文中 a 表示一个二进制数,a=1011 1010

1)按位与&

&:一边为 0,结果为 0

用法:

①清零

  如果想将一个单元清零,即使其全部二进制位为 0,只要与一个各位都是零的数值相与,结果为零。

②取一个数中指定位。

  设:a=1011 1010,取 a 的后四位,用 a&0000 1111=0000 1010 即可得到。
  找一个数,对应 a 要取的位,该数的对应位为 1,其余位为零,此数与 x 进行“与运算”可以得到 x 中的指定位。

2)按位或 |

|:一边是 1,结果是 1

用法:

将某一位设置为 1

  找到一个数,对应 a 要设置为 1 的位,该数的对应位为 1,其余位为零,此数与 a 相或可使 a 中的指定位设置为 1。

3)按位异或 ^

^:相同为 0,不同为 1

用法:

①与 1 相异或,使指定定位翻转

  设:a=1011 1010,使 a 后四位翻转,用 a^0000 1111=1011 0101 即可得到。
  找一个数,对应 a 要翻转的位,该数的对应为 1,其余位为零,此数与 a 对应位异或即可。

②与 0 相异或,保留原值

  a^0000 0000 =1011 1010

③两个变量交换值

方法一:借助第三个变量来实现

C=A;A=B;B=C;

方法二:利用加减法实现两个变量的交换

A=A+B;B=A-B;A=A-B;

方法三:用位异或运算来实现,也是效率最高的

  原理:一个数异或本身等于 0 ,异或运算符合交换律

A=A^B;B=A^B;A=A^B

4)按位取反 ~

~:二进制数按位取反,即将 0 变为 1,1 变 0

5)左移 <<

  将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补 0),若左移时舍弃的高位不包含 1,则每左移一位,相当于该数乘以 2。
  例:2<<1 =4 10<<1=100

6)右移 >>

  将一个数的各二进制位全部右移若干位,正数左补 0,负数左补 1,右边丢弃。若右移时舍高位不是 1(即不是负数),操作数每右移一位,相当于该数除以 2。
  例:4>>1=2

7)无符号右移运算 >>>

  各个位向右移指定的位数,右移后左边空出的位用零来填充,移除右边的位被丢弃。

4、进制转换

二进制 0b 开头
八进制 0 开头
十六进制 0x 开头

系数:每一位上的数值本身就是系数。
基数:X 进制的基数就是 X。
权:我们对每一位上的数据进行编号,从右往左从 0 开始编号,这个编号就是权值。

1)其他进制转十进制

  每一位上的系数*基数的权次幂的和。
例:
image.png

2)十进制转其他进制

  除基取余,直到商为 0,余数反转。
例:
image.png

3)十进制小数转为二进制

  乘二取整,直到小数位为0。
例:
image.png

5、Java 中关于进制转换的方法

  Integer 类的方法

1)十进制转二进制

public static String toBinaryString(int i);

2)十进制转八进制:

public static String toOctalString(int i);

3)十进制转十六进制:

public static String toHexString(int i);

4)十进制转x进制:

  x可以为任何进制。

public static String toString(int i, int x);

5)将其他进制转为十进制

  使用第二个参数指定的基数,将字符串参数解析为整数。

public static int parseInt(String s, int radix) throws NumberFormatException

  使用 Integer 类中的 parseInt()方法和 valueOf()方法都可以将其他进制转化为 10 进制不同的是 parseInt()方法的返回值是 int 类型,而 valueOf()返回值是 Integer 对象。

public static Integer valueOf(String s, int radix) throws NumberFormatException

标题:Java的按位运算与进制转换
作者:Yi-Xing
地址:http://47.94.239.232:10014/articles/2019/09/19/1568903092320.html
博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!