关于位运算几道经典题目

之前就和同学讨论过几道位运算的题目,觉得挺有意思的,就记录一波。
这样坐着敲字总让我想起在出租房里百无聊赖的日子、
题目一:
single number 问题
整型数组中只有一个整数只出现了一次,其他整数都出现了两次,找出出现一次的这个整数,并返回。
异或运算
利用异或运算整型数自身与自身异或为0的特点。

int singleNum(int[] arr){
    int res = arr[0];
    for(int i=1;ilength;i++){
        res=res^arr[i];
    }
    return res;
}

题目二:一个十进制数的二进制形式中1的个数
与运算
利用与运算0&1=0,不断将一个非零数不断将二进制形式中的1置于0

int get_one_num(int n){
    int res = 0;
    while(n){
       n = n&(n-1);
       res++;
    }
    return res;
}

题目三:判断一个数是否为2的幂,比如1=2^0,2=2^1,4=2^2
与运算
利用与运算中,2&1=0,4&3=0,利用2的幂-1与2的幂的与运算结果为0,2的幂的二进制形式一定只有一位为1,其他为0,而他的减一形式一定是这一位为0,其他为1.

boolean istwores(int n){
     return n&(n-1)==0?True:False;
}

题目四 判断一个数是否为4的幂,4^0=1,4^1=4,4^2=16
4^n=2^(2n)
则如果数是4的幂,那么首先一定是2的幂,并且2n必然取值只有0,2,4,等偶数形式

boolean isfourres(int n){
       return n&&(n-1)==0&&n&(0x55555555)?True:False;
}

题目五 判断一个数是否为3的幂,3^0=1,3^1=3,3^2=9
如果一个数是3的幂,那么它具有它的所有约数也都是3的幂的形式,比如,3^2=9,9的约数有1,3,9,都是3的幂的形式。
所以我们的思路是找到整型最大范围内是3的幂形式的那个数,这个数记作为maxNum
要判断n是否是3的幂的形式,那么只需要看maxNum%n==0?True:False;
int maxNum = (int) Math.pow(3,(int)(Math.log(0x7fffffff)/Math.log(3)));
OK,国庆快乐。

你可能感兴趣的:(面试题目)