我一直在做一些小代码测试,只是为了在毕业后重新开始我的编码,但这个得到了我的残余。这是问题:
给定n和2个整数p1,p2确定位置p1和p2中的位是否相同。基于p1,p2和1的位置。
实施例
22,3,2是真的,因为它是0001 0110,因为2和3的位置是相同的。
我解决了一种方法,即将小数转换为二进制,然后转换为字符串并检查位置中的位是否相同,但我觉得有一种更简单的方法来处理位操作但我是不太好用它。我在想是否可以将这些位移到第一个位置然后比较它们我可以得到答案但是当我将它们移动到左移时我遇到了问题,因为它们只是溢出。
答案 0 :(得分:5)
你可以将有趣的位移到最不重要的位置,然后使用&
屏蔽所有其他位。
假设p1
和p2
是从最低有效位开始的从零开始的索引:
bool same_bits = (((n >> p1) & 1) == ((n >> p2) & 1))
答案 1 :(得分:1)
int bitPositionsSame(uint32_t n, uint32_t p1, uint32_t p2) {
uint32_t i1 = (n & (1 << p1)) >> p1;
uint32_t i2 = (n & (1 << p2)) >> p2;
return (i1 == i2);
}
答案 2 :(得分:0)
我认为你可以做到
(((0x1&lt;&lt; p1)&amp; n)== 0)==(((0x1&lt;&lt;&lt; p2)&amp; n)== 0)
这将创建1的位掩码作为p1 / p2位,然后将其应用于数字。然后我们检查两者是否为零,并比较结果。
无法检查,因为我现在不在电脑前,但我认为它应该可行:)
编辑:当我输入我的答案时,其他一些人更快地输入...
答案 3 :(得分:0)
在C:
#define SAMEBIT(n, p1, p2) \
((n >> (p1-1)) & (n >> (p2-1)) & 1)
在Smalltalk中:
(n bitAt:p1) = (n bitAt:p2)
Java中的:
like C
答案 4 :(得分:0)
您可以使用位掩码和&
(按位和)运算符执行此操作。您可以使用p1
(向左移位)将p2
位移动到正确的位置,从而创建两个位掩码 - 一个用于1
,另一个用于<<
。使用每个位掩码屏蔽n
并比较结果。
答案 5 :(得分:0)
假设0基于最高有效位(即符号位为0)
boolean bitPositionsSame(int n, int p1, int p2) {
return (n & 0x80000000>>>p1)==(n & 0x80000000>>>p2);
}
答案 6 :(得分:0)
获取p1
的{{1}}位:
n
获取(n >> (p1-1)) & 1
的{{1}}位:
p2
比较他们的平等:
n
答案 7 :(得分:0)
这是另一种变体:
bool same_bits = !(n & p1 - 1) == !(n & p2 - 1);
使用bool
将按位AND的结果类型强制转换为!
会将可能的值限制为0
或1
。