原码、反码、补码
整数在C语言中的二进制表示方法有三种:原码、反码、补码。
有符号整数的三种表示方法均有符号位和数值位两部分
符号位都是用0表示“正”,1表示“负”
正整数的原码、反码、补码都相同
负整数的三种表示方法各不相同
原码:直接将数值按照正负数形式翻译成二进制得到的就是原码
反码:将原码的符号位不变,其余位按位取反得到的就是反码
补码:反码+1得到的就是补码
对于整形来说:数据存放在内存中的是补码:
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值位统一处理;同时可以将加法和减法统一处理(CPU只有加法器)
移位操作符
(注释:移位操作符的操作数只能是整数)
左移操作符
移位规则:左边抛弃,右边补0
int main()
{
int a = 10;
int n = a << 1;
printf("a = %d\n", a);
printf("n = %d\n", n);
return 0;
}
int a = 10
00000000000000000000000000001010
00000000000000000000000000010100 左移一位后结果
右移操作符
移位规则:右移操作符分为两种
1.逻辑右移:左边用0填充,右边抛弃
2.算术右移:左边用原数值填充,右边抛弃
我们大多使用的是算术右移
int main()
{
int a = 10;
int n = a >> 1;
printf("a = %d\n", a);
printf("n = %d\n", n);
return 0;
}
int a = 10;
00000000000000000000000000001010
00000000000000000000000000000101 右移两位以后的结果
警告:对于移位运算位,不能移动负数位
eg.
int a = 10;
a <<-1; //error
位操作符:&、|、^、~
& 按位与
| 按位或
^ 按位异或
~ 按位取反
注意:他们的操作数必须是整数
&:在二进制表示中,每一位的运算规则是:只有当两个相应的位都为1时,结果的该位才为1,否则为0
|:对于每一位,如果两个数中至少有一个在该位上是1,则结果在该位上也是1;如果两个数在该位上都是0,则结果在该位上是0
^:它对两个数的二进制表示进行逐位比较,如果两个相应的位相同,则结果位为0;如果不同,则结果位为1
~:对一个整数的二进制表示中的每一位进行翻转,即0变为1,1变为0
int main()
{
int a = -3;
int b = 5;
printf("%d\n", a & b);
printf("%d\n", a | b);
printf("%d\n", a ^ b);
printf("%d\n", ~0);
return 0;
}
举例练习:
不创建第三个变量,实现两个变量数值的交换
法一:
int main()
{
int a = 3;
int b = 5;
printf("a=%d b=%d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("a=%d b=%d", a, b);
return 0;
}
虽然这个方法容易想到,但是存在缺陷,当a,b数值过大时,会发生溢出
法二:
int main()
{
int a = 3;
int b = 5;
printf("a=%d b=%d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d b=%d\n", a, b);
return 0;
}
这种方法就不会存在上述问题
求 一个整数存储在内存中的二进制中1的个数
法一:
int main()
{
int a = 10;
int count = 0;
while (a)
{
if (a % 2 == 1)
{
count++;
}
a = a / 2;
}
printf("%d",count);
return 0;
}
法二:
int main()
{
int a = 3;
int count = 0;
while (a)
{
count++;
a = a & (a - 1);
}
printf("%d", count);
return 0;
}
编写代码将13二进制的第五位修改为1,再改为0
00000000000000000000000000001101
00000000000000000000000000011101
00000000000000000000000000001101
int main()
{
int a = 13;
a = a | (1 << 4);
printf("a = %d\n", a);
a = a & ~(1 << 4);
printf("a = %d", a);
return 0;
}