位運算是底層開發基本功。本文實現:整數轉二進制字符串顯示(每 4 位分組)、指定低位翻轉 (XOR 掩碼)。
#include
// 整數轉二進制字符串 (MSB 在前)
char* itobs(int n, char *ps) {
const int SIZE = 8 * sizeof(int);
for (int i = SIZE - 1; i >= 0; --i, n >>= 1)
ps[i] = (n & 1) + '0';
ps[SIZE] = '\0';
return ps;
}
// 格式化輸出:每 4 位加空格
void show_bstr(const char *str) {
for (int i = 0; str[i]; ++i) {
putchar(str[i]);
if ((i+1) % 4 == 0 && str[i+1]) putchar(' ');
}
}
// 翻轉低 bits 位
int invert_end(int num, int bits) {
int mask = 0;
for (int i = 0; i < bits; ++i) {
mask |= (1 << i); // 構建低 bits 位為 1 的掩碼
}
return num ^ mask; // XOR 翻轉
}
int main() {
char bin_str[8*sizeof(int)+1];
int number;
while (scanf("%d", &number) == 1) {
printf("Original: "); show_bstr(itobs(number, bin_str)); putchar('\n');
number = invert_end(number, 4); // 翻轉低 4 位
printf("Inverted: "); show_bstr(itobs(number, bin_str)); putchar('\n');
}
return 0;
}
Input: 15 Original: 0000 0000 0000 0000 0000 0000 0000 1111 Inverted: 0000 0000 0000 0000 0000 0000 0000 0000 (低4位 1111 → 0000) Input: 10 Original: 0000 0000 0000 0000 0000 0000 0000 1010 Inverted: 0000 0000 0000 0000 0000 0000 0000 0101 (1010 → 0101)
mask = (1 << bits) - 1 更高效 (位移後減 1 得到低 bits 位全 1),循環構建僅為教學演示。x ^ 1 = ~x (單位翻轉),x ^ mask 批量翻轉掩碼為 1 的位。(n & 1) + '0' 利用 ASCII 碼連續性轉字符。
// 翻轉第 start 到 end 位 (0-indexed, 含端點)
int invert_range(int num, int start, int end) {
int mask = ((1 << (end - start + 1)) - 1) << start;
return num ^ mask;
}