我对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");
}
}
答案 0 :(得分:6)
&#34;交替模式&#34;表示没有两个相邻位相同的模式,即01010101
或10101010
之类的模式。
解决方案分为两部分:
第一部分使用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");
注意:在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;
}