什么是被64整除
一个数能够被64整除,当且仅当这个数模64等于0。也就是说,这个数的最后6位二进制全是0。因为64的二进制是1后面跟6个0,所以一个数能被64整除的充要条件就是这个数的二进制末尾有6个0。
位运算
在C++中,有几个位运算符可以用来检查一个数的二进制末尾是否全是0。它们是“按位与”(&)、“按位或”(|)、“按位异或”(^)和“按位取反”(~)。其中,“按位与”和“按位或”用的较多。
按位与
按位与的规则是:两个数的二进制对应位上都是1,结果这一位就是1,否则就是0。
int a = 10; // 十进制数10的二进制为1010
int b = 12; // 十进制数12的二进制为1100
int c = a & b; // c的二进制为1000,即十进制数8
按位与的用处就在于检测某一位是否等于1。
按位或
按位或的规则是:两个数的二进制对应位上只要有一个是1,结果这一位就是1,否则就是0。
int a = 10; // 十进制数10的二进制为1010
int b = 12; // 十进制数12的二进制为1100
int c = a | b; // c的二进制为1110,即十进制数14
按位或的用处就在于将某一位设为1。
如何判断一个数能否被64整除
因为能被64整除的数的二进制末尾有6个0,所以对于一个32位整数而言,判断它能否被64整除,只需判断其后6位是否全为0即可。
可以用按位与和按位或来满足这个条件。首先定义一个64的二进制值,即0x3f,它的二进制表示为“00000000000000000000000000111111”。然后将这个值与待判断的数按位与。如果结果等于0,就说明这个数能被64整除。
bool isDivisibleBy64(int x) {
return (x & 0x3f) == 0;
}
移除位如何实现判断
移除位即指将指定二进制位上的数值0,这个操作可以使用位运算符“按位异或”(^)来实现。使用按位异或时,与待操作的数位相同的掩码相同,要将其对应的二进制位置为0。为了将第n位二进制上的数值变成0,可以使用1左移n位,然后取反,这样就可得到一个掩码。再将该掩码与数字进行异或运算,可将数字对于的二进制位清零。
int removeBit(int x, int n) {
int mask = ~(1 << n);
return x ^ mask;
}
这个函数的输入是一个整数x和一个非负整数n,返回值是将x的第n位二进制位置为0后的结果。其中,mask的二进制表示为“1111111111111111111111111111111111111111111111111111111111111110”,它的二进制末尾是n个连续的1,说明将第n位二进制位置为0。
将判断是否能整除64的功能和去除二进制位的功能结合起来
可以先移除数字的二进制末尾的6个二进制位,再判断得到的数字能否被64整除。
bool isDivisibleBy64(int x) {
return (x & 0x3f) == 0;
}
int removeLastSixBits(int x) {
return x >> 6 << 6;
}
bool isDivisibleBy64AfterRemovingSixBits(int x) {
return isDivisibleBy64(removeLastSixBits(x));
}
在上面的代码中,函数removeLastSixBits用来移除数字的二进制末尾的6个二进制位,方法是将数字右移6位(即除以64),然后再左移6位(左移后补上6个0),即得到一个新的数字,其二进制末尾6位都是0。接下来,使用isDivisibleBy64函数判断得到的数字能否被64整除。
总结
本文主要介绍了如何在C++程序中判断一个数是否能被64整除。通过对位运算符“按位与”和“按位或”的介绍,我们了解了它们分别适用于检测某一位是否等于1和将某一位设为1。然后,我们介绍了如何使用“按位与”配合掩码来判断一个数的二进制末尾是否全是0,并用isDivisibleBy64函数实现了这个功能。接下来,我们对位移除进行了介绍,并通过函数removeBit演示了如何将数字的二进制某一位设为0。最后,我们将判断数字能否被64整除和移除数字二进制末尾6位结合起来,实现了函数isDivisibleBy64AfterRemovingSixBits。