我如何测试所有位是否已设置或所有位都未设置?
How can I test if all bits are set or all bits are not?
如何使用按位运算符测试整数的 n 个最低有效位是全部集合还是全部不集合。
例如 if n = 3
我只关心 3 个最低有效位,测试应该 return 0 和 7 为真,0 到 7 之间的所有其他值为假。
当然可以 if x = 0 or x = 7
,但我更喜欢使用按位运算符。
如果可以调整该技术以考虑掩码定义的所有位,则加分。
澄清:
如果我想测试是否设置了第一位或第二位,我可以 if ((x & 1 != 0) && (x & 2 != 0))
。但我可以做到 "more efficient" if ((x & 3) != 0)
.
我正试图找到这样的 "hack" 来回答问题 "Are all bits of x that match this mask all set or all unset?"
简单的方法是 if ((x & mask) == 0 || (x & mask) == mask)
。我想找到一种在没有 || 的情况下在单个测试中执行此操作的方法运算符。
怎么样?
int mask = (1<<n)-1;
if ((x&mask)==mask || (x&mask)==0) { /*do whatever*/ }
唯一真正棘手的部分是掩码的计算。它基本上只是将 1 移到 0b0...0100...0
然后减去 1 使其成为 0b0...0011...1
.
也许你可以澄清一下你想要测试什么?
Using bitwise operator how can I test if the n least significant bits of an integer are either all sets or all not sets.
要获得最后 n
个有效位的掩码,那就是
(1ULL << n) - 1
所以简单的测试是:
bool test_all_or_none(uint64_t val, uint64_t n)
{
uint64_t mask = (1ULL << n) - 1;
val &= mask;
return val == mask || val == 0;
}
如果你想避免||
,我们将不得不利用整数溢出。对于我们想要的情况,在 &
之后,val
是 0
或(假设 n == 8)0xff
。所以 val - 1
是 0xffffffffffffffff
或 0xfe
。失败原因是 1
到 0xfe
,变成 0
到 0xfd
。因此成功案例至少调用 0xfe
,即 mask - 1
:
bool test_all_or_none(uint64_t val, uint64_t n)
{
uint64_t mask = (1ULL << n) - 1;
val &= mask;
return (val - 1) >= (mask - 1);
}
我们也可以通过加1而不是减1来测试,这可能是最好的解决方案(这里一旦我们在val
上加一,val & mask
应该变成0
或者1
我们的成功案例):
bool test_all_or_none(uint64_t val, uint64_t n)
{
uint64_t mask = (1ULL << n) - 1;
return ((val + 1) & mask) <= 1;
}
对于任意掩码,减法方法的工作原理与它适用于特定掩码情况的原因相同:0
翻转为最大可能值:
bool test_all_or_none(uint64_t val, uint64_t mask)
{
return ((val & mask) - 1) >= (mask - 1);
}
要测试是否所有都没有设置,您只需要屏蔽您想要的位,然后您只需要与零进行比较。
当您通过反转输入来定义相反的函数时,乐趣就开始了:)
//Test if the n least significant bits arent set:
char n_least_arent_set(unsigned int n, unsigned int value){
unsigned int mask = pow(2, n) - 1; // e. g. 2^3 - 1 = b111
int masked_value = value & mask;
return masked_value == 0; // if all are zero, the mask operation returns a full-zero.
}
//test if the n least significant bits are set:
char n_least_are_set(unsigned int n, unsigned int value){
unsigned int rev_value = ~value;
return n_least_arent_set(n, rev_value);
}
这是您想在一个函数中执行的操作(未经测试,但您应该明白了)。 Returns 如果未设置最后 n 位则为 0,如果全部设置则为 1,否则为 -1。
int lastBitsSet(int num, int n){
int mask = (1 << n) - 1; //n 1-s
if (!(num & mask)) //we got all 0-s
return 0;
if (!(~num & mask)) //we got all 1-s
return 1;
else
return -1;
}
如何使用按位运算符测试整数的 n 个最低有效位是全部集合还是全部不集合。
例如 if n = 3
我只关心 3 个最低有效位,测试应该 return 0 和 7 为真,0 到 7 之间的所有其他值为假。
当然可以 if x = 0 or x = 7
,但我更喜欢使用按位运算符。
如果可以调整该技术以考虑掩码定义的所有位,则加分。
澄清:
如果我想测试是否设置了第一位或第二位,我可以 if ((x & 1 != 0) && (x & 2 != 0))
。但我可以做到 "more efficient" if ((x & 3) != 0)
.
我正试图找到这样的 "hack" 来回答问题 "Are all bits of x that match this mask all set or all unset?"
简单的方法是 if ((x & mask) == 0 || (x & mask) == mask)
。我想找到一种在没有 || 的情况下在单个测试中执行此操作的方法运算符。
怎么样?
int mask = (1<<n)-1;
if ((x&mask)==mask || (x&mask)==0) { /*do whatever*/ }
唯一真正棘手的部分是掩码的计算。它基本上只是将 1 移到 0b0...0100...0
然后减去 1 使其成为 0b0...0011...1
.
也许你可以澄清一下你想要测试什么?
Using bitwise operator how can I test if the n least significant bits of an integer are either all sets or all not sets.
要获得最后 n
个有效位的掩码,那就是
(1ULL << n) - 1
所以简单的测试是:
bool test_all_or_none(uint64_t val, uint64_t n)
{
uint64_t mask = (1ULL << n) - 1;
val &= mask;
return val == mask || val == 0;
}
如果你想避免||
,我们将不得不利用整数溢出。对于我们想要的情况,在 &
之后,val
是 0
或(假设 n == 8)0xff
。所以 val - 1
是 0xffffffffffffffff
或 0xfe
。失败原因是 1
到 0xfe
,变成 0
到 0xfd
。因此成功案例至少调用 0xfe
,即 mask - 1
:
bool test_all_or_none(uint64_t val, uint64_t n)
{
uint64_t mask = (1ULL << n) - 1;
val &= mask;
return (val - 1) >= (mask - 1);
}
我们也可以通过加1而不是减1来测试,这可能是最好的解决方案(这里一旦我们在val
上加一,val & mask
应该变成0
或者1
我们的成功案例):
bool test_all_or_none(uint64_t val, uint64_t n)
{
uint64_t mask = (1ULL << n) - 1;
return ((val + 1) & mask) <= 1;
}
对于任意掩码,减法方法的工作原理与它适用于特定掩码情况的原因相同:0
翻转为最大可能值:
bool test_all_or_none(uint64_t val, uint64_t mask)
{
return ((val & mask) - 1) >= (mask - 1);
}
要测试是否所有都没有设置,您只需要屏蔽您想要的位,然后您只需要与零进行比较。
当您通过反转输入来定义相反的函数时,乐趣就开始了:)
//Test if the n least significant bits arent set:
char n_least_arent_set(unsigned int n, unsigned int value){
unsigned int mask = pow(2, n) - 1; // e. g. 2^3 - 1 = b111
int masked_value = value & mask;
return masked_value == 0; // if all are zero, the mask operation returns a full-zero.
}
//test if the n least significant bits are set:
char n_least_are_set(unsigned int n, unsigned int value){
unsigned int rev_value = ~value;
return n_least_arent_set(n, rev_value);
}
这是您想在一个函数中执行的操作(未经测试,但您应该明白了)。 Returns 如果未设置最后 n 位则为 0,如果全部设置则为 1,否则为 -1。
int lastBitsSet(int num, int n){
int mask = (1 << n) - 1; //n 1-s
if (!(num & mask)) //we got all 0-s
return 0;
if (!(~num & mask)) //we got all 1-s
return 1;
else
return -1;
}