C++中的位運算符允許你直接操作二進制位,這可以提高程序的性能,減少內存使用,并且有時可以使代碼更加簡潔和高效。以下是一些常見的位運算技巧及其在C++中的應用:
num & 1
)、計算一個數的二進制表示中1的個數(通過循環和位運算實現)等。以下是一些位運算技巧的具體應用示例:
int num = 15;
bool isEven = !(num & 1); // true, 因為15的二進制是1111,最后一位是1,所以是奇數
int num = 15;
int count = 0;
while (num) {
count += num & 1; // 如果最后一位是1,計數加1
num >>= 1; // 右移一位
}
位運算可以用于實現快速冪算法,從而高效地計算a^n % mod
。
int fastPower(int base, int exponent, int mod) {
long long result = 1;
base = base % mod;
while (exponent > 0) {
if (exponent % 2 == 1) { // 如果當前位是1
result = (result * base) % mod;
}
exponent = exponent >> 1; // 右移一位
base = (base * base) % mod; // 平方
}
return static_cast<int>(result);
}
不需要使用臨時變量就可以交換兩個變量的值。
int a = 5, b = 7;
a = a ^ b; // a現在是12 (二進制0110)
b = a ^ b; // b現在是5 (二進制0101)
a = a ^ b; // a現在是7 (二進制0111)
#define PERMISSION_READ 0b0001 // 二進制0001
#define PERMISSION_WRITE 0b0010 // 二進制0010
#define PERMISSION_EXECUTE 0b0100 // 二進制0100
int main() {
int permissions = PERMISSION_READ | PERMISSION_WRITE; // 二進制0011
if ((permissions & PERMISSION_READ) == PERMISSION_READ) {
// 有讀權限
}
return 0;
}
位運算可以用于優化某些特定類型的數組排序,例如整數數組。
void sortArray(int* arr, int size) {
for (int i = 0; i < size - 1; ++i) {
for (int j = 0; j < size - i - 1; ++j) {
if ((arr[j] & 0x55555555) > (arr[j + 1] & 0x55555555)) { // 使用0x55555555(二進制10101010...)進行比較
std::swap(arr[j], arr[j + 1]);
}
}
}
}
位運算可以用于字符串的某些操作,例如檢查子串是否存在。
bool containsSubstring(const std::string& str, const std::string& substr) {
if (substr.size() > str.size()) return false;
for (size_t i = 0; i <= str.size() - substr.size(); ++i) {
bool match = true;
for (size_t j = 0; j < substr.size(); ++j) {
if ((str[i + j] & ~substr[j]) != str[i + j]) { // 檢查字符是否匹配
match = false;
break;
}
}
if (match) return true;
}
return false;
}
位運算可以用于優化內存使用,例如通過位字段來存儲多個布爾值。
struct Flags {
unsigned int isEnabled : 1; // 二進制0001
unsigned int isActive : 1; // 二進制0010
// ...其他標志位
};
位運算可以用于優化循環,例如通過位掩碼來控制循環的執行次數。
int countBits(int num) {
int count = 0;
while (num) {
count += num & 1; // 如果最后一位是1,計數加1
num >>= 1; // 右移一位
}
return count;
}
位運算可以用于優化條件判斷,例如通過位掩碼來檢查多個條件是否滿足。
int checkAccess(int permissions, int requiredPermissions) {
return permissions & requiredPermissions; // 檢查是否有權限
}
通過合理使用這些位運算技巧,你可以在C++中編寫出更加高效和簡潔的程序。