Java位运算及左右移

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,其余不变。

在这里插入图片描述

例题,

在这里插入图片描述

在这里插入图片描述

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;
    }
}

在这里插入图片描述

3、Java中的位运算

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

3.1、左移

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

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

value << 1,左移1位:

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

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

在这里插入图片描述
左移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为例来画一下图:

在这里插入图片描述

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值