在C语言中,二进制数的表示和运算可以通过多种方式实现,以下是主要方法及示例:
一、二进制数的表示方法
直接使用二进制字面量 C99标准后支持以`0b`或`0B`开头表示二进制数,例如:
```c
int binary_num = 0b1010; // 十进制10
```
位运算符操作
- 按位与(&): 只有对应位都为1时结果为1,例如: ```c int a = 0b1010, b = 0b0110; int c = a & b; // 结果0b0010 (十进制2) ``` - 按位或(|)
```c
int c = a | b; // 结果0b1110 (十进制14)
```
- 按位异或(^):对应位不同结果为1,相同为0,例如:
```c
int c = a ^ b; // 结果0b1100 (十进制12)
```
- 移位运算符:左移`n`位相当于乘以2,右移`n`位相当于除以2(符号位不变),例如:
```c
int a = 0b1010;
int b = a << 2; // 结果0b101000 (十进制40)
int c = a >> 1; // 结果0b0101 (十进制5)
```
- 位段:在结构体中定义固定位数的整数类型,例如:
```c
struct BitField {
unsigned int a:4;
unsigned int b:2;
};
BitField bf = {0b1010, 0b11}; // a=10, b=3
```
二、二进制计算技巧
计算二进制中1的个数
使用异或运算和循环统计,例如:
```c
int count_ones(int n) {
int count = 0;
while (n) {
count += n & 1;
n >>= 1;
}
return count;
}
```
判断奇偶位
通过按位与运算判断最低位是否为1(奇数):
```c
int is_odd(int n) {
return n & 1;
}
```
二进制转十进制
通过位运算逐位计算,例如:
```c
int binary_to_decimal(int n) {
int result = 0;
for (int i = 0; i < 32; i++) {
result += (n >> i) & 1;
}
return result;
}
```
三、二进制与十进制转换
十进制转二进制
手动计算时采用“除2取余,逆序排列”法,例如:
```c
void dec_to_bin(int n, char *bin) {
char result = {0};
while (n > 0) {
result[64 - __builtin_ctz(n)] = n % 2 + '0';
n /= 2;
}
result = '0';
// 反转字符串
for (int i = 0; i < 32 / 2; i++) {
char temp = result[i];
result[i] = result[31 - i];
result[31 - i] = temp;
}
}
```
二进制转八进制
每3位二进制对应1位八进制,例如:
```c
int binary_to_octal(int n) {
char bin = {0};
binary_to_bin(n, bin);
for (int i = 0; i < 32 / 3; i++) {
printf("%d", bin[31 - 3 *