欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二进制相关

程序员文章站 2022-07-15 09:57:17
...

258. 各位相加
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
10 1
11 2
12 3
13 4
14 5
15 6
17 8 
18 9 0
19 1
20 2
21 3
22 4
23 5
24 6

class Solution {
public:
    int addDigits(int num) {
        return (num-1)%9+1;
    }
};

讨论里面的dalao:
For base b (decimal case b = 10), the digit root of an integer is:
dr(n) = 0 if n == 0
dr(n) = (b-1) if n != 0 and n % (b-1) == 0
dr(n) = n mod (b-1) if n % (b-1) != 0
or
dr(n) = 1 + (n - 1) % 9
Note here, when n = 0, since (n - 1) % 9 = -1, the return value is zero (correct).
From the formula, we can find that the result of this problem is immanently periodic, with period (b-1).
so,一般化之后就是 1+(n-1)%(base-1) 对base进制的数n,把各个数位上的数字相加,最后得到一个一位数是多少 

给定一个整数,编写一个函数来判断它是否是 2 的幂次方。

class Solution {
public:
    bool isPowerOfTwo(int n) {
        if(n<=0) return false;
        bool flag=false;
        if((n&(n-1))==0)
            flag = true;
        return flag;
    }
};

判断一个数 n 是否是 3的幂 
假设存在一个N>n ,若 N 是 3的幂,且 N%n=0 , 那么n肯定是3的幂,因为 N分解因子后除了 3没有别的因子,若有的话也就不再是 3的幂了
若 把 3 换成一个非素数 k ,那么上面的结论就不成立了,因为这时候 N可以被分解为多个素因子(p1^a1*p2^a2*p3^a3...),n也可以被分解为多个素因子(b1^c1*b2^c2...)再有 N % n =0 那么有可能是 N的部分因子把n的整除 ,自然不能说明,n是k的幂,也不能说N是k的幂
 结论: 若 N>n, 存在一个素数k 使得 N=k^p(p=0,1,3...),且 N % n = 0 ,那么 n= k^p(p=0,1,2,3..)
 反之不成立,只是一个充分不必要条件 
   3^k = MAX;
   k=log3(MAX);
   k=log(MAX)/log(3);
   3^k % n == 0

class Solution {
public:
    long long pqw(long long t,int x){
        long long ans=1;
        while(x){
            if(x&1) ans*=t;
            x>>=1;
            t =t*t;
        }
        return ans;
    }
    bool isPowerOfThree(int n) {
        if(n<=0) return false;
        int MAX = 0x7fffffff;
        int k = log(MAX)/log(3);
        long long N =pqw(3,k);
        return N % n == 0;
    }
};

给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。 

class Solution {
public:
    bool isPowerOfFour(int num) {
        if(num<=0) return false;
        return (num&(num-1))==0 && num&(0x55555555);
    }
};

编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数
输入:00000000000000000000000000001011
输出:3

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int cnt = 0;
        while(n){
            ++cnt;
            n&=n-1;
        }
        return cnt;
    }
};
//除K取余法
int hammingWeight(uint32_t n) {
        int ans=0;
        while(n)
        {
            ans+=n%2;
            n>>=1;
        }
        return ans;
}
//直接判断二进制最低为的数是不是1
int hammingWeight(uint32_t n) {
        int ans=0;
        while(n)
        {
            ans+=n&1;
            n>>=1;
        }
        return ans;
}

颠倒给定的 32 位无符号整数的二进制位。
输入: 00000010100101000001111010011100
输出: 00111001011110000010100101000000
解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
      因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t ans=0;
        int i=31;
        while(i--)
        {
            ans+=n&1;  //ans |= n&1;
            ans<<=1;
            n>>=1;
        }
        return ans;
    }
};

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t ans=0;
        int i=32;
        while(i--)
        {
            ans<<=1;
            ans+=n&1;  //ans |= n&1;
            n>>=1;
        }
        return ans;
    }
};