【CSAPP阅读笔记】之信息的存储

一、信息的存储
1.进制转换

在计算机中我们常需要装换的进制有二进制,十进制,八进制,十六进制。

其中,二进制,八进制,十六进制之间的转换都是非常简单的,直接参照下面的表进行按位替换就行了。要注意的是,八进制与二进制转换是一个八进制位等价三个二进制位,十六进制与二进制转换是一个十六进制等价四个二进制位。

二进制八进制十六进制
000000
000111
001022
001133
010044
010155
011066
011177
10008
10019
1010A
1011B
1100C
1101D
1110E
1111F

至于十进制与其他进制之间的转换,也是完全套用规律,用十进制与二进制之间的转换举例即可。

1.十进制装换为二进制:

  void dec_to_bin( int dec )
{
    assert( dec >= 0 );
    //保存每次除完之后的余数
    int remain = 0;
    if ( dec == 0 )
        return ;
    remain = dec % 2;
    dec = dec / 2;
    //递归求解
    dec_to_int( dec );
    printf( "%d", remain );
}

2.二进制转换为十进制:

void bin_to_dec( unsigned long  bin  )
{
    assert( bin >= 0 );
    int result = 0;
    int i = 0;
    //权重
    int weight = 1;
    while ( bin )
    {
        result += (bin%10) * weight;
        bin /= 10;
        //模拟2的n次方
        weight *= 2;
    }
    printf( "%d\n", result );
}
2.大端存储和小端存储

关于大端小端,用一幅图就可以说清楚。
图表现的是字0x01234567分别在大小端机器内的存储结构, 其中高位字节的十六进制值为0x01,而低位字节值为0x67.
大端小端示意图
大端是字的高位存储在地址的底位,字的低位存储在地址的高位。
小端是字的高位存储在地址的高位,字的低位存储的地址的低位。
linux一般为小端机,Windows的pc版本一般为大端机。

3.C语言中的位级运算

C语言的位级运算有 |(按位或),&(按位与),~(取反),^(异或),这些不用多说,值得说的一点就是可以利用异或实现不借助临时变量来交换两个变量的值,代码如下:

void inplace_swap(int *x, int *y)
{
    *x = *x ^ *y;
    *y = *x ^ *y;
    *x = *x ^ *y;
}

另外,这里再给出几种不借助临时变量来交换两个变量的值得其他方法:

void inplace_swap(int *x, int *y)
{
    *x = *y - *x;         //算出xy之间的差值
    *y = *y - *x;         //y减去yx之间的差值,得到的就是x的值
    *x = *y + *x;         //x加上yx之间的差值,得到的就是y的值
}

还可以用栈实现这个功能,实现方法比较简单,就不在贴代码了。

4.C语言中的移位运算

移位运算主要分为向左移动和向右移动,向左移动比较简单,都是采用的逻辑移位,而向右移动就要分情况处理,如果被移位的数是无符号的右移采用逻辑移位,如果是有符号的右移,大多都采用算术移位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值