程序检查给定的整数是否具有替代模式

时间:2016-08-01 02:37:01

标签: c bit-manipulation

我对C非常陌生,尤其是位操作程序。 我正在练习一些并且遇到一个问题 - " C程序来检查给定的整数是否具有替代模式"。以下是解决方案,我无法准确理解这段代码的作用和问题。替代模式意味着什么?

#include <stdio.h>

void main() {
    int num, x, y, count = 0;

    printf("enter the number:");
    scanf("%d", &num);
    x = num << 1;
    y = x ^ num;
    y = y + 1;

    while ((y / 2) != 0) {
        if (y % 2 != 0) {
            count++;
            break;
        } else {
            y = y / 2;
        }
    }
    if (count) {
        printf("false");
    } else {
        printf("true");
    }
}

3 个答案:

答案 0 :(得分:6)

&#34;交替模式&#34;表示没有两个相邻位相同的模式,即0101010110101010之类的模式。

解决方案分为两部分:

  • 第一部分将一个数字与自身向右移一位
  • 第二部分验证结果是2 n -1

第一部分使用XOR运算符^,只有当XOR-ed的两个位不同时才生成1。由于我们正在对一个自身向右移动的数字进行异或,因此交替模式会生成所有数字;任何其他模式都会在中间产生至少一个零。

第二部分在XOR的结果中加一,并通过重复除以二来检查结果是2 n 。这不是最有效的方法,但a better alternative不那么直观:您可以验证自身减去1的编号是否为零:

printf("enter the number:");
scanf("%d", &num);
x = num >> 1;
y = x ^ num;
printf("%s\n", y & (y+1) ? "false" : "true");

Demo.

注意:在32位系统上,此解决方案适用于最多31位的数字。如果签名类型用于num,则该值必须为非负值。

答案 1 :(得分:0)

代码适用于具有lsb为1(010101)的备用模式的数字。但是如果lsb为0(如10101010中所示),则代码不能正常工作。在这种情况下,要么是右移,要么需要额外的增量来生成所有的。

    void main()
    {
        int num, x, y;
        printf("enter the number:");
        scanf("%d", &num);
        x = num << 1;
        y = x ^ num;
        y = y + 1;
        if (!(num&1))//Additional increment if lsb is 0 to get all 1's
            y++;

        if (y && (!(y&y-1)))//checking power of 2
            printf("\n%d has an alternate pattern\n",num);
        else
            printf("\n%d has no alternate pattern\n",num);

    }

`

答案 2 :(得分:0)

public static boolean isAlternatePattern(int num) {
        int mask1 = 0X55555555;
        int mask2 = 0XAAAAAAAA;
        return (num & mask1) == num || (num & mask2) == num;
}
相关问题