1、异或运算

定义:在java的位运算符中有一个异或的运算符,用符号(^)表示,其运算规则是:在两个二进制操作数的相同位中,相同则结果为0,不同则结果为1

异或运算有三个特征:
1、一个是0与一个数做异或操作还是本身;
2、本身与本身做异或操作为0;
3、异或操作还满足交换率;

2、与运算

定义:在两个二进制操作数的相同位中,两个操作数中位都为1,结果才为1,否则结果为0

特征

1、根据与运算定义,设二进制数字n ,则有:

  • 若n&1=0,则n二进制最右一位为0;
  • 若n&1=1,则二进制最右一位为1。

2、(n-1)解析: 二进制数字n最右边的 1变成 0,此 1右边的 0都变成 1。
n&(n-1):二进制n最右边的1变成0,其余不变。

java 异或运算规则 java异或运算怎么算_求余

例题,

java 异或运算规则 java异或运算怎么算_十进制_02

java 异或运算规则 java异或运算怎么算_求余_03

public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int sum=0;
        while(n!=0){
            sum+=n&1;
            n>>>=1;
        }
        return sum;
    }
}

java 异或运算规则 java异或运算怎么算_十进制_04

3、Java中的位运算

在使用的时候,无符号右移需要加"=",左移和右移不用加。

3.1、左移

左移:丢弃左边指定位数,右边补0。

先随便定义一个int类型的数int,十进制的value = 733183670,转换成二进制在计算机中的表示如下:

java 异或运算规则 java异或运算怎么算_java 异或运算规则_05

value << 1,左移1位:

java 异或运算规则 java异或运算怎么算_求余_06


左移1位后换算成十进制的值为:1466367340,刚好是733183670的两倍, 有些人在乘2操作时喜欢用左移运算符来替代

value << 8,左移8位看一下:

java 异或运算规则 java异或运算怎么算_求余_07


左移8位后变成了十进制的值为:-1283541504,移动8位后,由于首位变成了1也就是说成了负数,在使用中要考虑变成负数的情况

根据这个规则,左移32位后,右边补上32个0值是不是就变成了十进制的0了?答案是NO当int类型进行左移操作时,左移位数大于等于32位操作时,会先求余(%)后再进行左移操作。也就是说左移32位相当于不进行移位操作,左移40位相当于左移8位(40%32=8)。当long类型进行左移操作时,long类型在二进制中的体现是64位的,因此求余操作的基数也变成了64也就是说左移64位相当于没有移位,左移72位相当于左移8位(72%64=8)

3.2、右移

当为正数时: 丢弃右边指定位数,左边补0。

当为负数时: 丢弃右边指定位数,左边补1。

和左移一样,int类型移位大于等于32位时,long类型大于等于64位时,会先做求余处理再位移处理,byte,short移位前会先转换为int类型(32位)再进行移位。

3.3、无符号右移运算符

无符号右移运算符>>>和右移运算符>>是一样的,只不过右移时左边是补上符号位,而无符号右移运算符是补上0,也就是说,对于正数移位来说等同于:>>,负数通过此移位运算符能移位成正数。以-733183670>>>8为例来画一下图:

java 异或运算规则 java异或运算怎么算_java 异或运算规则_08

无符号右移运算符>>的运算规则也很简单,丢弃右边指定位数,左边补上0