关于java的位运算

2019/10/24

最近在看源码时,发现一些java基础有些记不清了。今天来回忆,整理一下。

       按位运算符是来操作整数基本数据类型中的单个“比特”(bir),即二进制位,位运算符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。        位运算符来源于C语言面向底层的操作,在这种操作中经常需要直接操作硬件,设置硬件寄存器内的二进制位。Java的设计初衷是为了嵌入电视机机顶盒,所以种面向底层的操作仍被保留了下来。

  • 最高位 - 二进制的最高位很重要,因为最高位关系到这个数值的正负,所以一定要弄清楚 jdk7之后,可以用二进制来表示整数,只要在二进制数值前面加 0b或者0B,十六进制加0x,int是32位二进制,Long是64位的二进制
     byte aByte = (byte)0b0010_0001;
     short aShort = (short)0b1010_0001_0100_0101;
     int anInt1 = 0b10100001010001011010000101000101;
     int anInt2 = 0b101;
     long aLong = 0b1010000101000101101000010100010110100001010001011010000101000101L;
     int temp = 0x31;

1、“与”、“位与”(&)

        按位“与”操作符,如果两个数的二进制,相同位数都是1,则该位结果是1,否则是0.

  例1 5&4

        5的二进制是  0000 0000 0000 0101

        4的二进制是  0000 0000 0000 0100

        则结果是       0000 0000 0000 0100  转为十进制是4。

2、“或”、“位或”(|)

        按位“或”操作符,如果两个数的二进制,相同位数有一个是1,则该位结果是1,否则是0

  例2  5 4

        5的二进制是  0000 0000 0000 0101

      4的二进制是  0000 0000 0000 0100

        则结果是        0000 0000 0000 0101  转为十进制是5。

3、“异或、“位异或”(^)

        按位“异或”操作符,如果两个数的二进制,相同位数只有一个是1,则该位结果是1,否则是0

  例3  5 ^ 4

        5的二进制是  0000 0000 0000 0101

        4的二进制是  0000 0000 0000 0100

        则结果是        0000 0000 0000 0001 转为十进制是1 

4、“非”、“位非”(~)也称为取反操作符

        按位“非”操作符,属于一元操作符,只对一个操作数进行操作,(其他按位操作符是二元操作符)。按位“非”生成与输入位相反的值,——若输入0,则输出1,若输入1,则输出0。

  例4  ~5

        5的二进制是  0000 0000 0000 0101

        则~5是           1111 1111 1111 1010  转为十进制是 -6。

        这里出现负数,强行插入一波^_^。

        电脑的的世界中只有0和1,那么负数怎么表示呢?

        二进制的正负是从高位看,最高位如果1则是负数,如果是0则是正数。

        如果负数单纯是把最高位变为1的话,在运算中会出现不是我们想要的值,所以引入了:原码,反码,补码。正数的原码,反码,补码都一样,负数的反码是对除了符号位(最高位)对原码取反,补码是对反码+1

        负数的二进制转化,计算机计算是用的补码

1、首先取出这个数的原码的二进制,

2、然后再求出反码

3、最后求出补码

  例5  -5

        -5的原码是                1000 0000 0000 0101

        求出反码的是            1111 1111 1111 1010

        求出补码是                1111 1111 1111 1011

Post Directory