位运算,不适用于实数,仅仅适用于整数、字符。
C语言的位运算只能操作整数、字符,实数是指数方式表示的,不适用于位运算。
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 main() 7 { 8 unsigned int num = -1; 9 10 printf("%d,%u ", num, num); 11 12 system("pause"); 13 }
输出结果:
-1,4294967295
请按任意键继续. . .
乱码
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 main() 7 { 8 printf("%d ", 10.3); 9 10 printf("%f ", 10); 11 12 printf("%d ", (int)10.3); 13 14 printf("%f ", (float)10); 15 16 system("pause"); 17 };
原码
也叫 符号-绝对值码
最高位0表示正,1表示负,其余二进制位是该数字的绝对值的二进制位。
原码简单易懂
加减乘除复杂,存在加减乘除四种运算,增加了CPU的复杂度
零的表示不唯一
没有在计算机中应用
反码
反码运算不便,也没有在计算机中应用。
移码
移码表示数值平移n位,n称为移码量
移码主要用于浮点数的阶码的存储
补码
已知十进制求二进制
求正整数的二进制
除2取余,直至商为零,余数倒叙排序。
求负整数的二进制
先求与该负数相对应的正整数的二进制,然后将所有位取反,末尾加1,不够位数时,左边补1
求零的二进制
全是0
已知二进制求十进制
如果首位是0,则表明是正整数,按普通方法来求
如果首位是1,则表明是负整数,将所有位取反,末尾加1,所得数字就是该负数的绝对值。
1 按位取反~
0变1
1变0
之前左边省略的0,变1
2 左移<<
i<<1 表示把 i 的所有二进制位左移一位
左移 n 位相当于乘以 2 的 n 次方
面试题:
1 #include<stdio.h> 2 3 main() 4 { 5 int i; 6 7 i = i * 8; 8 i = i << 3; 9 10 /* 请问上述两个语句,哪个语句执行的速度快 */ 11 }
3 右移>>
右端(低位)移出的二进制数舍弃,左端(高位)移入的二进制分两种情况:对于无符号整数和正整数,高位补0;对于负整数,高位补1.
4 按位与&
类似逻辑与&&,相当于把每一位进行逻辑与&&
&i 取i的地址
i&j i按位与j
1&1==1
1&0==0
0&1==0
0&0==0
5 按位异或^
相同为0,不同为1
1^0==1
0^1==1
1^1==0
0^0==0
6 按位或|
类似逻辑或||,相当于把每一位进行逻辑或||
1|1==1
1|0==1
0|1==1
0|0==0
位运算的现实意义:
通过位运算符,我们可以对数据的操作精确到每一位