C++中位运算

leetcode 342

判断一个数是不是4的n次方

X(一位二进制数,即0或1),和1进行与运算,判断X是0还是1;

      和0进行与运算,可以屏蔽X.

X,和0进行或运算,判断X是0还是1;

       和1进行或运算,可以屏蔽X.

1、从判断一个数是不是2的n次方-----最高位是1,低位全是0

          判断一个数 x 是不是 2 的次幂只需要查看等式 ((x - 1) & x) == 0 是否成立

比如16;      二进制表示为10000.

那么可以使用16-1=15的序列01111,与16运算

2、判断一个数x是不是4的n次方-------最高奇数位为1,其他都为0

     先判断x是不是2的n次幂,使用((x - 1) & x) == 0

   判断奇数位,可以参照前面的知识,构造序列010101。。。。。101,来判断。在32位字长的数表示中,可以表示为0x55555555.

以及:

(4^n-1) = (4-1) (4^(n-1) + 4^(n-2) + 4^(n-3) + ..... + 4 + 1),即判断(x-1)%3=0

在Java中,

public boolean isPowerOfFour(int num) {
    return Integer.toString(num, 4).matches("10*");
}
toString函数将num变为4进制数,并保存为字符串。然后在里面进行匹配

其中matches的用法,参照链接http://blog.csdn.net/amaowolf/article/details/7758215

3、判断一个数x是不是3的n次方


public class Solution {
public boolean isPowerOfThree(int n) {
    // 1162261467 is 3^19,  3^20 is bigger than int  
    return ( n>0 &&  1162261467%n==0);
}


public boolean isPowerOfThree(int n) {
    return (Math.log10(n) / Math.log10(3)) % 1 == 0;
}

public boolean isPowerOfThree(int n) {
    int[] allPowerOfThree = new int[]{1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147, 531441, 1594323, 4782969, 14348907, 43046721, 129140163, 387420489, 1162261467};
    return Arrays.binarySearch(allPowerOfThree, n) >= 0;
}

4、必要的判断

      判断x是否大于0.

5、acculate运算

http://blog.csdn.net/seadplus/article/details/7626047

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值