位运算,不适用于实数,仅仅适用于整数、字符。
C语言的位运算只能操作整数、字符,实数是指数方式表示的,不适用于位运算。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>
#include<stdlib.h> main()
{
unsigned int num = -; printf("%d,%u\n", num, num); system("pause");
}
输出结果:
-1,4294967295
请按任意键继续. . .
乱码
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>
#include<stdlib.h> main()
{
printf("%d\n", 10.3); printf("%f\n", ); printf("%d\n", (int)10.3); printf("%f\n", (float)); system("pause");
};
原码
也叫 符号-绝对值码
最高位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 次方
面试题:
#include<stdio.h> main()
{
int i; i = i * ;
i = i << ; /* 请问上述两个语句,哪个语句执行的速度快 */
}
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
位运算的现实意义:
通过位运算符,我们可以对数据的操作精确到每一位