在C语言中实现二进制数的加减乘除运算,需要根据数的表示形式选择合适的方法。以下是具体实现方式:
一、二进制数的表示与转换
二进制字符串转十进制
可通过遍历二进制字符串,按权展开转换为十进制整数。例如:
```c
int binaryToDecimal(char *binary) {
int decimal = 0, len = strlen(binary);
for (int i = len - 1; i >= 0; i--) {
if (binary[i] == '1') {
decimal += (1 << i);
}
}
return decimal;
}
```
十进制转二进制
可使用位运算实现,例如左移操作:`1 << n` 等价于乘以2的n次方。
二、二进制数的加减运算
加法
从最低位开始逐位相加,处理进位。例如:
```c
char* addBinary(char *a, char *b) {
int carry = 0;
char *result = (char *)malloc(2 * strlen(a) + 1);
int i = strlen(a) - 1, j = strlen(b) - 1;
while (i >= 0 || j >= 0 || carry) {
int sum = carry;
if (i >= 0) sum += a[i] - '0';
if (j >= 0) sum += b[j] - '0';
carry = sum / 2;
result[i + 1 - j] = (sum % 2) + '0';
i--;
j--;
}
result = '0';
// 反转结果
for (int k = 0; k < strlen(result) / 2; k++) {
char temp = result[k];
result[k] = result[strlen(result) - k - 1];
result[strlen(result) - k - 1] = temp;
}
return result;
}
```
减法
类似加法,但需处理借位。例如:
```c
char* subtractBinary(char *a, char *b) {
int borrow = 0;
char *result = (char *)malloc(2 * strlen(a) + 1);
int i = strlen(a) - 1, j = strlen(b) - 1;
while (i >= 0 || j >= 0) {
int diff = borrow;
if (i >= 0) diff += a[i] - '0';
if (j >= 0) diff -= b[j] - '0';
if (diff < 0) {
diff += 2;
borrow = 1;
} else {
borrow = 0;
}
result[i + 1 - j] = (diff % 2) + '0';
i--;
j--;
}
// 去除前导零
while (result == '0' && strlen(result) > 1) {
memmove(result, result + 1, strlen(result));
}
result = '0';
return result;
}
```
三、二进制数的乘法运算
原码乘法
采用逐位相乘并累加的方法。例如:
```c
char* multiplyBinary(char *a, char *b) {
int lenA = strlen(a), lenB = strlen(b);
int *partSum = (int *)calloc(2 * lenA, sizeof(int));
for (int i = 0; i < lenA; i++) {
int bit = a[lenA - 1 - i] - '0';
for (int j = 0; j < lenB; j++) {
partSum[i + j] += bit * (b[lenB - 1 - j] - '0');
}
}
char *result = (char *)malloc(2 * lenA + 1);
int carry = 0;
for (int i = 0; i < 2 * lenA; i++) {
int sum = partSum[i] + carry;
result[i] = (sum % 2) + '0';
carry = sum / 2;
}
result[2 * lenA] = '0';
free(partSum);
// 反转结果
for (int i = 0; i < strlen(result) / 2