位操作是编程中处理二进制数据的基本技术,在Linux环境下有多种方式可以进行位操作。以下是详细的处理方法:
unsigned int a = 0x0F; // 二进制: 00001111
unsigned int b = 0x55; // 二进制: 01010101
// 按位与
unsigned int result_and = a & b; // 0x05 (00000101)
// 按位或
unsigned int result_or = a | b; // 0x5F (01011111)
// 按位异或
unsigned int result_xor = a ^ b; // 0x5A (01011010)
// 按位取反
unsigned int result_not = ~a; // 0xFFFFFFF0 (11110000)
// 左移
unsigned int result_lshift = a << 2; // 0x3C (00111100)
// 右移
unsigned int result_rshift = a >> 2; // 0x03 (00000011)
// 设置某一位
#define SET_BIT(var, pos) ((var) |= (1 << (pos)))
// 清除某一位
#define CLEAR_BIT(var, pos) ((var) &= ~(1 << (pos)))
// 切换某一位
#define TOGGLE_BIT(var, pos) ((var) ^= (1 << (pos)))
// 检查某一位是否设置
#define CHECK_BIT(var, pos) ((var) & (1 << (pos)))
// 修改多个位
#define MODIFY_BITS(var, mask, value) ((var) = ((var) & ~(mask)) | ((value) & (mask)))
虽然Bash不是位操作的首选,但也支持基本的位运算:
#!/bin/bash
a=15 # 00001111
b=85 # 01010101
# 按位与
echo $((a & b)) # 输出5
# 按位或
echo $((a | b)) # 输出95
# 按位异或
echo $((a ^ b)) # 输出90
# 按位取反
echo $((~a)) # 输出-16 (有符号数)
# 左移
echo $((a << 2)) # 输出60
# 右移
echo $((a >> 2)) # 输出3
Python在Linux环境下也是位操作的优秀选择:
a = 0x0F # 00001111
b = 0x55 # 01010101
# 基本位运算
print(hex(a & b)) # 0x5
print(hex(a | b)) # 0x5f
print(hex(a ^ b)) # 0x5a
print(hex(~a & 0xFF)) # 0xf0 (处理Python的无符号数)
print(hex(a << 2)) # 0x3c
print(hex(a >> 2)) # 0x3
# 位操作实用函数
def set_bit(value, bit):
return value | (1 << bit)
def clear_bit(value, bit):
return value & ~(1 << bit)
def test_bit(value, bit):
return (value & (1 << bit)) != 0
echo "obase=16; ibase=16; F & 55" | bc # 按位与
echo "obase=16; ibase=16; F | 55" | bc # 按位或
# 提取文件的第5个字节
dd if=file.bin bs=1 count=1 skip=4 2>/dev/null | xxd -b
struct {
unsigned int flag1 : 1;
unsigned int flag2 : 1;
unsigned int value : 6;
} bitfield;
#include <limits.h>
// 查找最高设置位
int find_highest_bit(unsigned int num) {
int pos = -1;
while (num) {
num >>= 1;
pos++;
}
return pos;
}
// 使用GCC内置函数
int highest_bit = sizeof(num) * CHAR_BIT - __builtin_clz(num) - 1;
// 交换两个变量的值而不使用临时变量
a ^= b;
b ^= a;
a ^= b;
#define READ_PERM 0x01
#define WRITE_PERM 0x02
#define EXEC_PERM 0x04
void set_permissions(unsigned int *perms, unsigned int flags) {
*perms |= flags;
}
void clear_permissions(unsigned int *perms, unsigned int flags) {
*perms &= ~flags;
}
int check_permissions(unsigned int perms, unsigned int flags) {
return (perms & flags) == flags;
}
// 提取16位数的低8位和高8位
uint16_t value = 0xABCD;
uint8_t low_byte = value & 0xFF; // 0xCD
uint8_t high_byte = (value >> 8) & 0xFF; // 0xAB
位操作是Linux系统编程和底层开发中的重要技能,熟练掌握这些技术可以帮助你编写更高效、更紧凑的代码。