在整数中翻转某些位(C语言)

在整数中翻转某些位(C语言),c,C,我正试图让我的程序在某个位置被翻转的地方工作。我有一个函数叫做flipbit(int*p,int m)。用户需要输入数字和位号。假设用户给出了数字8(00001000)和位号2,那么8中的第2位应该翻转,变成00001010。我如何编程 编辑:我犯了一个愚蠢的错误,我想从0开始计数,所以翻转的8中的第2位实际上是00001100,而不是00001010 #include <stdio.h> #include <stdlib.h> void flipbit(int *p,

我正试图让我的程序在某个位置被翻转的地方工作。我有一个函数叫做
flipbit(int*p,int m)
。用户需要输入数字和位号。假设用户给出了数字
8
00001000
)和位号
2
,那么8中的第2位应该翻转,变成
00001010
。我如何编程

编辑:我犯了一个愚蠢的错误,我想从0开始计数,所以翻转的8中的第2位实际上是
00001100
,而不是
00001010

#include <stdio.h>
#include <stdlib.h>

void flipbit(int *p, int m) {
    int digit;
    digit = *p;

    int bit;
    bit = &m;

    int result;

    //printf("The numbers are %d %d", digit, bit);

    printf("%d", result);
}

int main() {
    int number1;
    int number2;

    printf("Give number and bit: ");
    scanf("%d, %d",&number1, &number2);

    flipbit(&number1, &number2);

    return 0;
}
#包括
#包括
无效翻转位(int*p,int m){
整数位数;
数字=*p;
整数位;
位=&m;
int结果;
//printf(“数字为%d%d”,数字,位);
printf(“%d”,结果);
}
int main(){
整数1;
整数2;
printf(“给出数字和位:”);
scanf(“%d,%d”,&number1和&number2);
翻转位(&number1和&number2);
返回0;
}

给定要翻转的位,您首先需要创建一个掩码。通过取值
1
并按位号左移来执行此操作

获得该掩码后,使用逐位异或运算符
^
翻转位

int mask = 1 << m;
*p = *p ^ mask;

intmask=1给定要翻转的位,首先需要创建一个掩码。通过取值
1
并按位号左移来执行此操作

获得该掩码后,使用逐位异或运算符
^
翻转位

int mask = 1 << m;
*p = *p ^ mask;

intmask=1检查源代码时,指针和值之间存在混合。
要使flipbit()函数的调用符合声明,调用应为:

// first parameter is a pointer and second parameter is a value
flipbit(&number1, number2); // void flipbit(int *p, int m);
int digit;

// 'digit' is a value and 'p' is a pointer
digit = p[0]; // 'digit' is the first value pointed by 'p'
在flipbit()函数中,由于数字是一个值,而p是一个指针,因此混合继续进行。代码应为:

// first parameter is a pointer and second parameter is a value
flipbit(&number1, number2); // void flipbit(int *p, int m);
int digit;

// 'digit' is a value and 'p' is a pointer
digit = p[0]; // 'digit' is the first value pointed by 'p'
与“bit”参数相同的错误类型

int bit;

// 'bit' is a value and 'm' is a value
bit = m;
翻转一位的结果就是异或运算

位号为2,因此第2个

根据您的规格,您只需移位(位-1)。 因此,在你的情况下:
0x0001(或0000.0000.0000.0001b)检查源代码时,指针和值之间存在混合。 要使flipbit()函数的调用符合声明,调用应为:

// first parameter is a pointer and second parameter is a value
flipbit(&number1, number2); // void flipbit(int *p, int m);
int digit;

// 'digit' is a value and 'p' is a pointer
digit = p[0]; // 'digit' is the first value pointed by 'p'
在flipbit()函数中,由于数字是一个值,而p是一个指针,因此混合继续进行。代码应为:

// first parameter is a pointer and second parameter is a value
flipbit(&number1, number2); // void flipbit(int *p, int m);
int digit;

// 'digit' is a value and 'p' is a pointer
digit = p[0]; // 'digit' is the first value pointed by 'p'
与“bit”参数相同的错误类型

int bit;

// 'bit' is a value and 'm' is a value
bit = m;
翻转一位的结果就是异或运算

位号为2,因此第2个

根据您的规格,您只需移位(位-1)。 因此,在你的情况下:

0x0001(或0000.0000.0000.0001b)这个问题有一个可能有用的答案:这里有一个提示:在开发代码时,总是在启用警告的情况下编译(例如,将
-Wall-pedantic
添加到命令行选项)。这样做会提醒您对函数第二个参数的处理不正确。请不要使用建议的更改更新代码。这将使现有答案无效。这个问题的答案可能会有所帮助:这里有一个提示:在开发代码时,始终在启用警告的情况下编译(例如,将
-Wall-pedantic
添加到命令行选项)。这样做会提醒您对函数第二个参数的处理不正确。请不要使用建议的更改更新代码。这将使现有答案无效。谢谢您的答案,但它不应该是digit=digit^mask@如果希望结果从调用函数可见,则Teuntje不是。更紧凑的形式是
value^=(感谢您的回答,但不应该是digit=digit^mask;?@Teuntje如果希望结果从调用函数可见,则不是。更紧凑的形式是
value^=(1)为什么bit前面有-1?感谢您的编辑,我正在尝试运行该程序。我给出了输入9 1,它应该给我输出11,但它给我输出8。我做错了什么?我已经更新了代码。如果您这样做:
result=digit^(1@FloppySoftware我得到了以下输出:-2147483648@Piquard,是的,以符合scanf。我犯了一个错误,请检查我的编辑。为什么bit在前面有-1?感谢编辑,我正在尝试运行程序。我给输入9 1,它应该给我输出11,但它给我输出8。我做错了什么?我已经更新了代码。如果你执行此操作:
result=digit^(1@floppy软件我得到以下输出:-2147483648@Piquard,是的,符合scanf。我犯了一个错误,请检查我的编辑。