基础算法:位运算

目录

一:给一个数n,判断二进制表示第X位是0还是1

二:给定一个数n(二进制数),将X位的修改成1 

三:给定一个二进制数n,将n的第X位修改成0

四:提取一个数n,将最右侧1提取出来

五:干掉最右侧的1,即将最右侧的1变成0

六:相关位运算力扣练习题

a:191题位1的个数  力扣191

b:338题比特位计数 力扣338

c:461题汉明距离  力扣461



在我们进行位运算的基础算法之前,先对任意一个二进制数n的第n位表示如下:

一:给一个数n,判断二进制表示第X位是0还是1

  以如下为例:

        //判断3的二进制第1位是0还是1
        int n=3;
        System.out.println((n>>1)&1);

运行结果:

二:给定一个数n(二进制数),将X位的修改成1 

  //要将3的二进制第2位变成1
        int n=3;//0 0 0 0 0 0 0 1 1
        System.out.println(Integer.toBinaryString(n));
        n=(1<<2)|n;
        System.out.println(Integer.toBinaryString(n));

运行结果: 

三:给定一个二进制数n,将n的第X位修改成0


        int n=3;//0 0 0 0 0 0 0 1 1
        System.out.println(Integer.toBinaryString(n));
        n=(~(1<<1))&n;
        System.out.println(Integer.toBinaryString(n));

运行结果:

四:提取一个数n,将最右侧1提取出来


        int n=3;//0 0 0 0 0 0 0 1 1
        System.out.println(Integer.toBinaryString(n));
        n=n&(-n);
        System.out.println(Integer.toBinaryString(n));

运行结果:

五:干掉最右侧的1,即将最右侧的1变成0

        int n=3;//0 0 0 0 0 0 0 1 1
        System.out.println(Integer.toBinaryString(n));
        n=n&(n-1);
        System.out.println(Integer.toBinaryString(n));

运行结果:

六:相关位运算力扣练习题

a:191题位1的个数  力扣191

    public int hammingWeight(int n) {
        int count=0;
        while(n!=0){
            n=n&(n-1);
            count=count+1;
        }
        return count;
    }
//利用n=n&(n-1)将每次n的最右边的1去掉,即将1变成0,当n为0的时候,就可以终止循环

b:338题比特位计数 力扣338

    public int[] countBits(int n) {
        int []array=new int[n];
        for(int i=0;i<=n;i++){
            int temp=i;
            int count=0;
            while(temp!=0){
                temp=temp&(temp-1);
                count++;
            }
            array[i]=count;
        }
      return array;
    }

c:461题汉明距离  力扣461

      //先进行异或,将x和y的1放在一个变量中,依据相同为0,不同为1的原则
        //假设:x=1  -----> 00001
        //    y=4  -----> 00100
        //  x^y    -----> 00101
        //此时利用x^y&(x^y-1)可以快速计算出两者之间的距离
       int temp=x^y;
       int count=0;
       while(temp!=0){
           temp=temp&(temp-1);
           count++;
       }
       return count;

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DJ懒羊羊。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值