目录
进制转换
某进制转十进制
在C语言中,由其他进制数向十进制数转化可以通过如下方式来实现,而C语言中没有直接转为其他进制的函数,需要自行编写
int main()
{
//0x558十进制输出
int n = 0x558;
printf("%d", (int)n);
return 0;
}
C语言进制前缀:二进制 0b 八进制 0 十六进制 0x
十进制负数转二进制负数
正数原码--原码取反--加1--得到的二进制就是负数的二进制
-7的二进制:
步骤:
1.先求+7的二进制:0000 0111 原码
2.反码:1111 1000
3.补码:1111 1001
-7的二进制为:1111 1001
二进制负数,转对应的十进制
已知二进制负数,求对应的十进制
1.负的二进制
2.二进制-1
3.取反
4.原码,将原码转成十进制,在十进制的前面添加负号
位运算
位运算符
运算符 | 含义 | 类型 | 优先级 | 结合性 |
~ | 按位取反 | 单目 | 高 | 从右向左 |
<<,>> | 左移位,右移位 | 双目 | ↓ | 从左向右 |
& | 按位与 | 双目 | ↓ | 从左向右 |
^ | 按位异或 | 双目 | ↓ | 从左向右 |
| | 按位或 | 双目 | 低 | 从左向右 |
位运算符的运算规则
a | b | a&b | a|b | a^b | ~a |
0 | 0 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 0 | 0 |
(1)按位与
类似逻辑运算符中的&&,同时为真则为真,否则为假,可用于对某字节的某位清零
0000 1111
& 0000 0001
———————
0000 0001
其中,15和1均以补码形式表示
int main()
{
int n1 = 0b0110;//6
int n2 = 0b0010;//2
printf("%d\n", n1 & n2);//会进行十进制输出
return 0;
}
运行结果:
2
(2)按位或
有一个为真则为真,否则为假,可用于对字节中的某位置1
0000 1111
| 0111 1111
———————
0111 1111
其中01111111时127的补码,所以15|127=127
int main()
{
int n1 = 0b0110;//6
int n2 = 0b0010;//2
printf("%d\n", n1 | n2);
return 0;
}
运行结果:
6
(3)按位异或
二进制对应位相异时则为真,否则为假
0000 0011
^ 0000 0101
———————
0000 0110
其中00000110是6的补码,所以3^5=6
int main()
{
int n1 = 0b0110;//6
int n2 = 0b0010;//2
printf("%d\n", n1 ^ n2);
return 0;
}
运行结果:
4
(4)按位取反
各位取反,即0变1,1变0,符号位也会发生改变,得到的二进制数为补码,若为负数需要转化为原码再转化为十进制
~ 0000 0101
———————
1111 1010
其中,11111010是-6的补码,所以~5=-6,~5就是将5的二进制取反,之后负的二进制转为十进制
小结: ~a=-(a+1) a为十进制
int main()
{
int n1 = 0b0110;//6
int n2 = 0b0010;//2
printf("%d\n", ~n1);
printf("%d\n", ~n2);
return 0;
}
运行结果:
-7
-3
(5)左移位,右移位
<<左移位,右边空位自动补0
>>右移位,当x为有符号数时,左边空位补符号位上的值,称为算术移位;当x为无符号数时,左边空位补0,称为逻辑移位
注意:无论左移位还是右移位,从一端移走的位不移入另一端,移出的位的信息都丢失了
int main()
{
int n = 12;//0000 1100
printf("%d\n", n << 1);//0001 1000 12*2
printf("%d\n", n << 2);//0011 0000 12*2*2
printf("%d\n", n << 3);//0110 0000 12*2*2*2
printf("%d\n", n >> 2);//0000 0011 12/2/2
return 0;
}
运行结果:
24
48
96
3
int main()
{
int m = -15;//1111 0001
printf("%d\n", m >> 1);//1111 1000 (-15)/2 无论正数还是负数,都是向下取整
printf("%d\n", m >> 2);//1111 1100
return 0;
}
运行结果:
-8
-4
注意事项
(1)位运算符是针对二进制执行的运算,但操作数不一定必须是二进制形式
int main()
{
int m1 = 6;
int m2 = 2;
printf("%d\n", m1 & m2);
return 0;
}
运行结果:
2
(2)不要将逻辑运算与位运算相混淆
int main()
{
short x = 12, y = 8;
printf("%5hd%5hd%5hd\n",!x, x || y, x && y);
printf("%5hu%5hu%5hu\n",~x, x | y, x & y);
printf("%5hd%5hd%5hd\n\n",~x, x | y, x & y);
return 0;
}
运行结果:
0 1 1
65523 12 8
-13 12 8
(3)补充关于浮点数的一条内容:不要用==或!=测试两个浮点数是否相等,或者判断一个浮点数是否等于0