首先定义一个整数假如是5,将他转换为二进制类型的话就是101,前面是29个0,这个就是它的原码,然后反码就是将它的第一个二进制位即符号位不变,之后的31个数位的值由1变0,由0变1得到它的反码,反码加1变成补码,也就是0111111111111111111111111111101这个数加1得到011111111111111111111111111110,也就是它的补码,补码再减1后得到反码,反码由1变0,由0变1之后就是原码,最终输出的结构果都是以原码的形式输出。
而'~'这个操作运算符的作用就是将一个整数的二进制补码按位取反,将1变为0,将0变为1,然后得到新的补码,再由这个补码转换为原码就是新的数字,输出的是原码,就是这个新数字。
如;0的原码是00000000000000000000000000000000,其补码和原码一致,所以0的补码也是00000000000000000000000000000000,然后我们对它使用操作运算符~之后,将其补码按位取反,也就是11111111111111111111111111111111,这个就是0的补码的~之后的结果,然后将这个结果减1,然后除了符号位之外的数按位取反得到100000000000000000000000000000001,最终的结果就是-1.
源代码;
#include <stdio.h>
int main()
{
int a = 0;
printf("%d\n", ~a);
}
结果是-1.
例题2:11的二进制数位为00000000000000000000000000001011,假如让我们给倒数第三个为0的那个数换为1,该怎么换?
源代码:
#include <stdio.h>
int main()
{
a=11;
a=a|(1<<2);
}
这样得到的结果就是00000000000000000000000000001111,假如我们又想让倒数第三个数变为0了该怎么办?
源代码:
#include <stdio.h>
int main()
{
int a=15;
a=a&(~(1<<2));
}
先把1的二进制数位向左移两位,也就是00000000000000000000000000000100,然后在按位取反~,就是11111111111111111111111111111011,再把这个值和00000000000000000000000000001111按位与一下,同1值取1,不同取0,这样就把0和1相对的值都取为了0,得到结果。