位运算题型汇总

(一)2的幂

(1)题目描述

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。

如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。

(2)思路:(n&(n-1))==0  ||

n > 0 && (n & -n) == n;

(3)代码

class Solution38 {
    public boolean isPowerOfTwo(int n) {
        /*if(n==2||n==0){
            return true;
        }
        if(n%2!=0){
            return false;
        }
        //递归方法层次太深,所以会出现java.lang.StackOverflowError
        return isPowerOfTwo(n/2);*/

//        利用位运算(1)
//        return n > 0 && (n & (n - 1)) == 0;

//        利用位运算(2)
        return n > 0 && (n & -n) == n;
}
}

(二)

(1)题目

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。

(2)思路:n & (1<<i))!=0

(3)代码

class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        //将1循环左移,若与当前数与时不为0,表示n当前位置的数为1,否则为0
        int result = 0;
        for (int i = 0; i < 32; i++) {
            if ((n & (1<<i))!=0) {
                result++;
            }
        }
        return result;
    }
}

(三)

(1)题目:颠倒给定的 32 位无符号整数的二进制位。

(2)代码:

class Solution02 {
    // you need treat n as an unsigned value
    public int reverseBits(int n) {
        int rev=0;
        //添加条件n!=0:若n做了逻辑右移操作后,若其在某步操作后变为0,则后面就没有再继续移位操作的必要了
        for (int i = 0; i <32&&(n!=0) ; i++) {
            /*
             * 解读:
             * (1)n&1:取n得最后一位
             * (2)(n&1)<<(31-i):将最后一位向左移31-i位,此时的结果中只有一位有效位(可能为1,可能为0),其余位全为0以此来进行颠倒操作
             * (3)rev|=(n&1)<<(31-i):将上一步的结果与全0进行或操作,得到最终结果
             * (4)n>>>=1:n算术右移1位,方便取末位
             * */
            rev|=(n&1)<<(31-i);
            n>>>=1;
        }
        return rev;
    }
}

(四) 只出现一次的数组

(1)题目

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

(2)思路:利用异或

任何数和 00 做异或运算,结果仍然是原来的数,即 a \oplus 0=aa⊕0=a。
任何数和其自身做异或运算,结果是 00,即 a \oplus a=0a⊕a=0。
异或运算满足交换律和结合律,即 a \oplus b \oplus a=b \oplus a \oplus a=b \oplus (a \oplus a)=b \oplus0=ba⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b

(3)代码

class Solution03 {
    public int singleNumber(int[] nums) {
        int reslut=0;
        //普通方法
        /*int j;
        int result=0;
        Arrays.sort(nums);
        for (int i = 0; i < nums.length-1; i++) {
            j=i+1;
            while (nums[i]==nums[j]){
                j++;
            }
            if(j-i==1){
                result=nums[i];
                break;
            }else{
                i=j-1;
            }
        }
        return result;*/
        //异或方法
        for (int i:nums) {
            reslut^=i;
        }
        return reslut;

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值