7-92 位运算
给定一个数,将该数的某二进制位上置0、置1或取反。
输入格式:
第1行:输入一个十进制整数。(32位int取值范围,其二进制数补码表示)
第2行后:每行输入一个位操作运算要求。
格式:输入位操作运算类型(
1表示置0,2表示置1,3表示按位取反) 位数(从最低位向高位,范围从0~31)最终以键盘输入
^Z或 文件结束(EOF标志)。输出格式:
输出位运算后的整数值。
输入样例:
在这里给出一组输入。例如:
3 1 0 1 1 2 3 3 1 3 2 2 0输出样例:
在这里给出相应的输出。例如:
15
正确答案
#include <stdio.h>
int setOne(int n, int index) {
return n |= (1 << index);
}
int setZero(int n, int index) {
return n &= ~(1 << index);
}
int reverse(int n, int index) {
return n ^= (1 << index);
}
int main() {
int n;
scanf("%d", &n);
int op, index;
while (scanf("%d %d", &op, &index) != EOF) {
if (op == 1) {
n = setZero(n, index);
}
if (op == 2) {
n = setOne(n, index);
}
if (op == 3) {
n = reverse(n, index);
}
}
printf("%d", n);
return 0;
}
有问题的答案
#include <stdio.h>
int main() {
int n, arr[32], op, figure = 0, negative = 0;
scanf("%d", &n);
// 初始化数组
for (int i = 0; i < 32; ++i) {
arr[i] = 0;
}
if (n < 0) {
n = -n;
negative = 1;
}
// 将十进制转换为二进制存储进数组
while (n != 0) {
arr[figure++] = n % 2;
n /= 2;
}
// 将二进制数组后移前置0
for (int i = 0; i < figure; ++i) {
arr[32 - figure + i] = arr[figure - i - 1];
arr[figure - i - 1] = 0;
}
// 如果该数小于0则最高位置为1
if (negative) {
arr[0] = 1;
}
while (scanf("%d %d", &op, &figure) != EOF) {
if (op == 1) {
arr[31 - figure] = 0;
} else if (op == 2) {
arr[31 - figure] = 1;
} else {
if (arr[31 - figure] == 0) {
arr[31 - figure] = 1;
} else {
arr[31 - figure] = 0;
}
}
}
// 计算值
int res = 0, factor = 1;
for (int i = 32; i >= 0; --i) {
res = res + arr[i] * factor;
factor *= 2;
}
if (arr[0] == 1) {
res = -res;
}
printf("%d", res);
return 0;
}
思路
- 正确答案就是利用c语言提供的位运算操作符来实现
- 有问题的版本是一开始自己写的版本,想着暴力实现一下,但是怎样都是错的找不到原因,欢迎大佬对代码指出错误😣😣
这篇博客介绍了一个C语言程序,用于对整数进行位运算,包括置0、置1和取反操作。程序首先读取一个32位整数,然后根据用户输入的指令对特定位进行操作,并输出结果。示例中给出了正确和错误的代码实现,讨论了如何通过位运算符直接操作二进制位与暴力转换二进制数组的方法之间的差异。
424

被折叠的 条评论
为什么被折叠?



