LeetCode-693. 交替位二进制数、476. 数字的补数、371. 两整数之和

    xiaoxiao2022-07-12  168

     

    目录

    693. 交替位二进制数

    476. 数字的补数

    371. 两整数之和


    693. 交替位二进制数

     

    【题目】:

    【代码】:假如n=10(1010),(n>>1)=5(0101),n^(n>>1)=(1111),要么r是int类型最大值,要么r+1是2的幂。也可以直接return ((r+1)&r)==0;

    class Solution { public boolean hasAlternatingBits(int n) { int r= n^(n>>1); return isPowerOfTwo(r+1)|| r==Integer.MAX_VALUE ; //return ((r+1)&r)==0; //ok } public static boolean isPowerOfTwo(int n) { return n>0 && (n & n-1)==0; } }

    效果:


    476. 数字的补数

    【题目】:

    【代码】:

    class Solution { public int findComplement(int num) { int temp=num; //5(00000101) int mask=0; while(temp!=0){ mask=(mask<<1)+1; //构造一个00000111的掩码 temp>>=1; } return num^mask; //00000101^00000111=00000010 } }

    效果:

     

    方法2:可以利用 Java 的 Integer.highestOneBit() 方法来获得含有首 1 的数。

    public int findComplement(int num) { if (num == 0) return 1; int mask = Integer.highestOneBit(num); mask = (mask << 1) - 1; return num ^ mask; }

    方法3:对于 10000000 这样的数要扩展成 11111111,可以利用以下方法:

    mask |= mask >> 1 11000000 mask |= mask >> 2 11110000 mask |= mask >> 4 11111111 public int findComplement(int num) { int mask = num; mask |= mask >> 1; mask |= mask >> 2; mask |= mask >> 4; mask |= mask >> 8; mask |= mask >> 16; return (mask ^ num); }

    371. 两整数之和

    【题目】:

    【代码】:

    class Solution { public int getSum(int a, int b) { if(b==0){ return a; //没有进位时返回异或的结果 } int m=a^b; //无进位的相加 int n=(a&b)<<1; //每一位的进位 return getSum(m,n); } }

    效果:


     

    最新回复(0)