我今天在我的教员(塞尔维亚贝尔格莱德数学系)获得了一项任务,其中说:
1)编写一个程序,对于两个给定的整数x和y,在整数x中反转与y中相应位匹配的那些位,而其余位保持不变。
例如:
x = 1001110110101
y = 1100010100011
x' = 0011101011100
我设法写了一个程序来做到这一点,但我对我的解决方案的质量有点不安全。如果你有时间,请查看代码并告诉我如何改进它。
int x, y, bitnum;
int z = 0;
unsigned int mask;
bitnum = sizeof(int) * 8;
mask = 1 << bitnum - 1;
printf("Unesi x i y: ");
scanf("%d%d", &x, &y);
while (mask > 1) {
if ( (((x & mask) == 0) && ((y & mask) == 0)) ||
((x & mask) && ((y & mask) == 0)) )
z += 1;
z <<= 1;
mask >>= 1;
} /* <-- THAT'S HOW STUPID PEOPLE SOLVE PROBLEMS... WITH HAMMER! */
z = y~; /* <-- THAT'S HOW SMART PEOPLE SOLVE PROBLEMS... WITH ONE LINE */
一切正常,例如,对于x = 423和y = 324,我得到z = -344,这是正确的。此外,位打印匹配我想知道是否有更好的方法来做到这一点。
感谢。
答案 0 :(得分:0)
如果您查看x
/ y
/ x'
示例,则必须告诉您x'
是y
的补充。确实就是这样。
x y x'
--------
1 1 0
0 0 1
1 0 1
0 1 0
Spoiler(如果你想看到一个解决方案,将鼠标悬停在下面的块上):
对于匹配的位,您将
x
中的位反转,但由于它与y
中的位相同,所以它与y
中的反转位相同。如果它们不匹配,则保持位x
,即y
中已经反转的位。我希望你能亲自看到一线解决方案:x' = ~y;
答案 1 :(得分:0)
//尝试使用下一个代码:
unsigned int mask1,mask2,mask3,answers;
mask1 = x&amp; Ÿ; //识别1匹配
的位mask2 = ~x&amp; 〜ÿ; //识别0匹配
的位mask3 = mask1 |掩码2; //识别0或1匹配
的位answers = x ^ m3; //更改已识别的位