C语言中的进制转换

进制转换:  

    为什么要使用二进制、八进制、十六进制?

        因为现在的CPU只能识别高低两种电流,只能对二进制数据进行计算

        二进制数据虽然可以直接被CPU识别计算,但是不方便书写、记录,所以把二进制数据转换成八进制是为了方便记录到文档中

        随着CPU的不断发展位数不停增加,由早期的8位逐渐发展到现在的64位,因此八进制不再能满足需求,所以发展出了十六进制,由于历史原因八进制还不能完全地退出历史舞台。

    

    十进制转二进制:(转其他进制)

        求余法:用2对数据求余,记录余数,然后继续对商求余,直到商为0结束,过程中产生的余数就是该数据的二进制(逆序)

            n  % 2 = 0|1

            商 % 2 = 0|1

            直到商为0

        127 % 2     1

        63  % 2     1

        31  % 2     1

        15  % 2     1

        7   % 2     1

        3   % 2     1

        1   % 2     1

        0

        01111111

        求权法: 从高位到低位,数据 - 2^(n-1) ,如果能减,第n位就是1,否则就是0

        137

        128 64 32 16 8 4 2 1

         1  0  0   0 1 0 0 1

        

    手算:

        79 63 121 49

    

    练习1:输入一个正整数以及m,然后显示该正整数的m(m>=2)进制,超过10进制用字母表示 10A  11B  12C  13D

    二进制转十进制:

        每位的2^(n-1)求和

        10011010  128+16+8+2 = 154

    二进制转八进制:

       低位起,每三位二进制位对应一位八进制  

       二进制: 1 001 101 110 010 

       八进制: 1  1   5   6   2 

    

    二进制转十六进制:

        低位起,每四位二进制位对应一位十六进制 

        二进制:  1 1011 0111 1010

        十六进制:1  B    7    A 

    在C语言中:以0开头的数据都是八进制,以0x开头的数据都是十六进制数据

        %o 以八进制形式显示数据

        %x 以十六进制形式显示数据

        %#o %#x 以对应格式显示不同进制

    

原码、反码、补码:

    原码:数据的二进制 -10    10001010

    

    反码:

        正数的反码就是原码

        负数的反码是原码除符号位外,其它位按位求反 

    

    补码:数据在内存中都是以补码形式存储

        正数的补码就是原码

        负数的补码:

            1、转换成二进制的原码

            2、原码的符号位不变,其它按位求反得到反码

            3、反码+1得到补码

        -127

        1111 1111   原码

        1000 0000   反码

        1000 0001   补码

        0x81

        %hd 0000 0000 1000 0001 == 129

    补码转数据:

        无符号补码直接转换成十进制

        有符号最高位是0,说明是正数,也直接转换成十进制

        有符号且最高位是1:

            1、补码-1得到反码

            2、反码符号位不变,按位求反得到原码

            3、原码转换成十进制

        1111 1111   补码 有符号

        1111 1110   反码

        1000 0001   原码    -1

位运算符:  & | ~ ^ >> <<

    A & B   按位相与

    10101101    0xAD

    01101110    0x6E

    --------

    00101100    0x2C

    A | B   按位相或

    10101101    0xAD

    01101110    0x6E

    --------

    11101111    0xEF

    ~A      按位求反

    10101101    0xAD

    01010010    0x52

    A ^ B   按位异或 相同为0,相异为1

    10101101    0xAD

    01101110    0x6E

    --------

    11000011    0xC3

    A << n  把A的补码左移n位,右边补0,左边丢弃

    10101101 << 4   

    11010000 0xD0

    A >> n  把A的补码右移n位,右边丢弃,左边补符号位

    10101101 >> 4

    11111010

    输入一个整数,把它的4~7位设置为1010,其它位不能变

    xxxxxxxx xxxxxxxx xxxxxxxx 1010xxxx 

    num & ~(0xf<<4) | (0xA<<4)

输入两个整数,把A的4~7位设置为B的3~6位,其它位不能变

        A & ~(0xf0) | (B<<1 & 0xf0)

输入一个整数,显示该整数的补码

#include <stdio.h>

int main(int argc,const char* argv[])
{
    int num = 0;
    scanf("%d",&num);

    char bits[32] = {};
    for(int i=0; i<32; i++)
    {
        bits[i] = num >> i & 1;    
    }

    for(int i=31; i>=0; i--)
    {
        printf("%hhd",bits[i]);        
    }
}
 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值