【位运算题解2】

LC简单题1

题目描述:2的幂
给定一个整数n,如果它是2的幂,返回true;否则返回false;

(1)如果这个数小于0,那么一定不是2的幂
(2)如果是2的幂,那么二进制的表示必然为最低位为0,也就是1+若干个0的形式
(3)比如:10000 -> 减去1就成为:01111 ->也就是:10000 & 011111 = 00000
AC:

//code:
class Solution {
public:
    bool isPowerOfTwo(int n) {
        return (n > 0) && (n & (n - 1)) == 0;
    }
};

!!!

LC简单题2

题目描述:4的幂
给定一个数n,如果它是4的幂,返回true;否则返回false;

(1)首先4的幂一定是2的幂,但2的幂不一定是4的幂
(2)归纳得,2的偶数次幂模3等于1,22x mod 3 = 1 ;
2的奇数次幂模3 等于2 ,22x+1 mod 3 = 2 。
(3)然而,,2的偶数次幂模3,22xmod 3 =1,就是相当于 4x mod 3 = 1 ;
(4)于是一个数只要满足是2的幂,并且模3等于1就一定是4的幂。
AC:

//code:
class Solution {
public:
    bool isPowerOfFour(int n) {
        return (n > 0) && (n & (n - 1))== 0 && n % 3 == 1;
    }
};

!!!

LC简单题3

题目描述:位1的个数
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位为“1”的个数。

(1)首先,任何一个数的二进制都是由0和1组成
(2)那么假设存在一个数为……10000,对其进行减1,得……01111,再将这两个数相与,进行&操作,得……00000。这样就达到消去1的效果
(3)知道n变为0,终止循环。
AC:

//code:
class Solution {
public:
    int hammingWeight(uint32_t n) {
        int c = 0;           //定义一个计数器,记录消去1的个数
        while(n) {
            n &= (n - 1);   //进行位消去,消去1
            c ++;           //每消去一个1,就进行计数
        }                   //知道1被消除完,n为0时,终止循环
        return c;           //返回删除1的次数,即1的个数
    }
};

!!!

LC简单题4

题目描述:交换数字
编写一个函数,不用临时变量,交换 a 与 b 的值。

1.涉及的算法:

 a = a ^ b;
 b = a ^ b;
 a = a ^ b;

2.异或运算de运算规则(举例说明):

 520 ^ 520 = 0 //相同的数异或为0
 1314 ^ 0 = 1314 //任何数异或0为该数字本身
 1314  ^  520 = 520 ^ 1314; //满足交换律
 (1 ^ 2 ) ^ 3 = 1 ^ (2 ^ 3); //满足结合律 

3.最后,算法推导公式:

  a = a ^ b;
  b = a ^ b = a ^ b ^ b = a ^ 0 = a;
  a = a ^ b = a ^ b ^ a = a ^ a ^ b = 0 ^ b = b;

AC:

//code:
class Solution {
public:
    vector<int> swapNumbers(vector<int>& a) {
        a[0] = a[0] ^ a[1];
        a[1] = a[0] ^ a[1];
        a[0] = a[0] ^ a[1];
        return a;
    }
};

!!!

LC简单题5

题目描述:交换数字
给定一个非空整数数组,除了某个数字只出现一次以外,其余每个数字均出现两次。找出那个只出现一次的数字。

根据上一个题的异或运算规则,知道了异或运算:

 520 ^ 520 = 0 //相同的数异或为0
 1314 ^ 0 = 1314 //任何数异或0为该数字本身
 1314  ^  520 = 520 ^ 1314; //满足交换律
 (1 ^ 2 ) ^ 3 = 1 ^ (2 ^ 3); //满足结合律 
 
 a[0] ^ a[1] ^ a[2] ^ a[3]^……………………………………最终相互抵消,只剩下那个只出现一次的数字

AC:

//code:
int singleNumber(int* nums, int numsSize){
    int i;
    int sum = 0;
    for(i = 0;i < numsSize; i++) {
        sum =sum ^ nums[i];       //将数组中每一个数都进行异或
    }
    return sum;
}

!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值