目录
二进制的产生
电线只会两种电位,通电:记为1,不通电记为:0。
二进制的含义
二进制
1111=1*2^0+1*2^1+1*2^2+1*2^3=15
二进制是求模的的结果
1111=15对2求模,再除以2,再对2求模...
类比:十进制 123得出1 2 3 求模除十再求模......
计算机存储的是数据的补码
非负数的原码等于反码等于补码
//原->反->补
//00000001
//01111110
//01111111
负数:原码->符号位不变,其他取反->反码->加一->补码
//原 反 补
//10000001
//11111110
//11111111
*补码变原码:1.减一->符号位不变其余取反。2.符号位不变其余取反-加一。
补码变原码和原码变补码的路径是一样的
进制转换
在数字前面加0表示8进制,加0x表示16进制。
3位2进制=1位8进制
00111111
077
4位二进制等于1位16进制
00111 11111
0x7e
巧妙按位操作
在不溢出且不创建新变量下交换变量
原理:任意数和自身异或结果为0,0和任意数异或结果为本身(异或为加法)。
int a=5;
int b=3;
a=a^b; b=a^b; a=a^b;
判断2进制位的i位上的数字为0还是1
原理:1和任意数按位与最低位为1则结果为1,最低位为0结果为0,还能提出把2进制数提出
a=a>>i;
b=a&1;
//二进制位从零位开始
//b=1 i位为1,b=0 i位为0;
n&(n-1):消除着二进制位的1
原理:一次操作使二进制的右边1消失,有n个1,操作n次
n=15
//1111&1110=1110
//1110&1101=1100
//1100&1011=1000
判断某数是否为2的n次方:二进制只有一个1
类比:某数为10的n次方,十进制为也只有1。
求m,n有多少比特位不同
原理:用异或来判断,a=m^n有多少个1则有多少位相异。用a^(a-1)的执行次数求出1的个数。
a=m^n;
while(a^(a-1))
{
count++;
}
浮点型存储
用everything 来查找limits.h和float.h来确定整型和float范围
浮点数可以表示为:
5.5=(-1)^0*1.011*2^2=101.1
S=0 M=1.O11 E=2
S:控制正负,E:控制大小,M:控制精度
M不存1,只存小数点后的数。
E是个无符号整数(unsigned int),为保证E是个正数。
E的储存值等于E的真实值+中间值(8位是127 11位是1023)
如果E为全0:数值非常小,M取出时不加1,再根据保留的位数使得结果为0
E为全1:数值非常大,表示无穷大。
大小端字节存储:(以比特为单位)
大端字节存储:低位在高地址,高位在低地址。(高低)
小端字节存储:低位在低地址,高位在高地址。(双低)
//0x11223344
大端:11 22 33 44
小端:44 33 22 11
地址由低变高-->
vs2022是小端存储
图中是以16进制的形式,两位相当于一个字节。
如何判断大小端?char*来访问低地址字节
int a=10;
char*pa=&a;
if(*pa==0a)
{ printf("小端");
}
if(*pa==00)
{
printf("大端");
}