开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
1、二进制简介
1、正数
正数的原码、反码、补码是相同的。
例如十进制数10的32位二进制数
原码:00000000000000000000000000001010
反码:00000000000000000000000000001010
补码:00000000000000000000000000001010
他的原码反码补码一致!
2、负数
例如十进制数-10的32位二进制数
原码:10000000000000000000000000001010
反码:11111111111111111111111111110101 //符号位不变,其他位置01互换
补码:11111111111111111111111111110110 //反码加1
2、左移运算符 <<
int main()
{
int a = 10;
int b = a << 1;
//00000000000000000000000000001010 -补码
printf("%d\n", b);
printf("%d\n", a);
return 0;
}
会发现a=10经过左移运算之后数值变成了原来的二倍等于20赋给了b,a的数值没有改变。
a = 10 = 00000000000000000000000000001010
b = 00000000000000000000000000010100 = 20
3、右移运算符 >>
int main()
{
int a = 10;
int b = a >> 1;
//00000000000000000000000000001010 -补码
printf("b=%d\n", b);
printf("a=%d\n", a);
return 0;
}
会发现a=10经过右移运算之后数值变成了原来的一半等于5赋给了b,a的数值没有改变。
a = 10 = 00000000000000000000000000001010
b = 00000000000000000000000000010100 = 5
4、按位与&
int main()
{
int a = 10;
int b = 6;
printf("%d", a&b);
return 0;
}
10: 00000000000000000000000000001010
6: 00000000000000000000000000000110
10&6: 00000000000000000000000000000010 = 2
5、按位或 |
int main()
{
int a = 10;
int b = 6;
printf("%d", a|b);
return 0;
}
10: 00000000000000000000000000001010
6: 00000000000000000000000000000110
10&6: 00000000000000000000000000001110 = 8 + 4 + 2 = 14
6、按位异或 ^
int main()
{
int a = 10;
int b = 6;
printf("%d", a^b);
return 0;
}
10: 00000000000000000000000000001010
6: 00000000000000000000000000000110
10&6: 00000000000000000000000000001100 = 8 + 4 = 12
7、例题
不使用临时变量交换两个数
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;
}
a=00000000000000000000000000000011
b=00000000000000000000000000000101
a=a^b=00000000000000000000000000000110
b=a^b=00000000000000000000000000000011=5
a=a^b=00000000000000000000000000000101=3 交换完成!!