c#面试基础语法——现有?个整数number,请写?个?法判断这个整数是否是2的N次?

2023-12-13 06:51:02

1.number%2==0

取余(取模)只能判断number是不是2的倍数但不一定是2的N次方,如:6%2==0但是他并不是2的N次方

2.(number&(number-1))==0

原理:如果number是2的N次方则表示2进制位只有一位是1。如:2 (10) 4(100) 8(1000) 16(10000) 那么number-1就会得到一个低位全部是1的2进制数 1(01) 3(011)

拿8做例子

8? 1000

7? 0111

&? 0000

结果就是0? ?

当一个整数是2的N次方时,它的二进制表示只有一位是1,其余位都是0。例如,2的3次方是8,其二进制表示为00001000;2的4次方是16,其二进制表示为00010000

如果我们将一个2的N次方的整数减去1,会得到一个所有低位都是1的数。例如,对于2的3次方的整数8,减去1得到7,其二进制表示为00000111;对于2的4次方的整数16,减去1得到15,其二进制表示为00001111

当我们对这两个数进行按位与操作 (number & (number - 1)),如果结果等于0,则表示只有一位是1,也就是指定的整数是2的N次方。

举个例子,假设我们要判断整数12是否是2的N次方。其二进制表示为00001100。我们可以进行计算:

12       : 00001100
12 - 1   : 00001011
AND 操作 : 00001000

结果是00001000,不等于0,说明12不是2的N次方。

public static bool IsPowerOfTwo(int number)
{
    // 判断是否为负数或零
    if (number <= 0)
        return false;

    // 使用位运算判断是否只有一位是1
    return (number & (number - 1)) == 0;
}
private static boolean isPowerOfTwo(int n) {
    return (n > 0) && ((n & (n - 1)) == 0);
}

如果计算这个数是2的N次方得出返回N这个值

 public static int getExpontOfTwo(int number)
        {
            if(number <=0 || (number & (number -1)) != 0){
                return -1;
            }
            int expont = 0;
            while(number != 1)
            {
                number >>= 1;
                expont++;
            }
            return expont;
        }
    }

文章来源:https://blog.csdn.net/weixin_54498280/article/details/134940613
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。