在检查具有N的2的幂的正整数N时的错误

时间:2018-06-23 02:02:15

标签: c bit-manipulation bitwise-operators

我有这个程序来检查no是否为2的幂,但是如果no = 1099511627776,它在测试用例上不起作用:

int not; // no of testcase
unsigned long long int no; // input number
int arr[100];
scanf ("%d", &not);

for ( int i = 0; i < not; i++ )
{
    scanf ("%llu", &no);
    if ( no & !(no & (no - 1))) // check wheather no is power of 2 or not excludig 0
        arr[ i ] = 1;
    else
        arr[ i ] = 0;
}
for ( int i = 0; i < not; i++ )
{
    if ( arr[ i ] == 1 )
        printf ("YES\n");
    else
        printf ("NO\n");
}

3 个答案:

答案 0 :(得分:2)

出现错误是因为您将no设为零的比较不是与&运算符配合使用的良好逻辑表达式。

在一个值被单独使用的情况下,您可以避免这种情况,但是由于no是2的幂,并且0的最低有效位,因此no & [some-logical-expression]的结果为零

您可以通过三种方式解决此问题:

  • 使用&&代替&
  • no && !(no & (no - 1))前面添加!!,即no
  • 为零添加显式比较,即!!no & !(no & (no - 1))

我非常喜欢第一种方法。

Demo.

答案 1 :(得分:0)

&是按位与。您需要逻辑AND:no && !(no & (no - 1))

答案 2 :(得分:0)

从您提到的代码来看,这是我的一些观察结果。

首先,如果用户给not赋予的值大于100怎么办?如果您将not>100声明为arr的大小100,则会导致不确定的行为。为了避免这种情况,首先扫描not,然后创建等于not大小的数组。例如

int not = 0; // no of testcase
scanf ("%d", &not);
int arr[not]; /* create array equal to not size.. */

或者像动态创建数组一样

int not = 0; // no of testcase
scanf ("%d", &not);
int *arr = malloc(not * sizeof(*arr)); /* create dynamic array equal to not size.. */

其次,要检查给定的数字是否为2的幂,此!(no & (no - 1))是正确的,但要排除zero,即给定输入no是否为{ {1}},那么您不应该选中0。为此,请使用逻辑AND !(no & (no - 1))运算符。这个

&&

应该是

if ( no & !(no & (no - 1))) { 

}