波奇学数据结构:进制与数据存储

目录

二进制的产生

二进制的含义

计算机存储的是数据的补码

非负数的原码等于反码等于补码

负数:原码->符号位不变,其他取反->反码->加一->补码

进制转换

巧妙按位操作

在不溢出且不创建新变量下交换变量

判断2进制位的i位上的数字为0还是1

n&(n-1):消除着二进制位的1

求m,n有多少比特位不同

浮点型存储

S:控制正负,E:控制大小,M:控制精度

大小端字节存储:(以比特为单位)

如何判断大小端?char*来访问低地址字节


二进制的产生

电线只会两种电位,通电:记为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("大端");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值