C语言之进制转换

/*语言中进制表示 :
    二进制表示 : 在二进制数字前面加上0b;
    八进制表示 : 在八进制数字前面加上0;
    十六进制表示 : 在十六进制前面加上0x;
进制转换 ;
    将其他进制转换成八进制 : 在printf函数中以%o占位;
    将其他进制转换成十六进制 : 在printf函数中以%x占位;
    在C语言中,没有占位符可将其他进制转换成二进制;
    将其他进制转换成十进制 : 在printf函数中以%i或%d占位;
进制转换的原理公式 : 假定m为一个十进制数,转换成nk,nk-1,nk-2,...,n2,n1,n0的l进制数
                     则 m = n0 + n1 * l^1 + n2 * l^2 + .... + nk-2 * l^(k-2) + nk-1 * l ^(k-1) + nk * l^k
                     由上可见,当等式左右两端同时除以l时,余项为n0,在整数部分除以l则余项为n1,以此类推,便可以得到m的l进制表达
案例:十进制转换二进制(逆序打印)
#include 
void printBin(int num);
int main(int argc, const char * argv[]) {   
    int num = 4; // 100;
    printBin(num);
    return 0;
}
void printBin(int num)
{
    int zheng = num;
    while (zheng != 0)
    {
        int yu = zheng % 2;
        printf("%i",yu);
        zheng = zheng / 2;
    }
    printf("\n");
}
n为二进制的取值范围 : 0~2^n -1
二进制转八进制 : 三位变一位
二进制转十六进制 : 四位变一位
原码 反码 补码
    数据内存中均是以补码形式存储,正数的原码,反码,补码全部一样,三码合一
    原码 : 最高位为符号位(正数为0,负数为1),其他位则为数字位
    反码 : 负数的反码,最高位符号位不变,数字位取反
    补码 : 负数的补码,反码加1
位运算符 :
    按位与 : &    #数字转换成二进制后,对应位,全真则真,由此可见,任何数字和1的按位与还是数字本身    #注 : 可用此法结合移位运算进行进制转换
    按位或 : |    #数字转换成二进制后,对应位上,一真则真,由此可见,任何数字和0的按位或还是数字本身
    按位异或 : ^    #数字转换成二进制后,对应位上,相同则取0,不同则取1.相同的两个数字按位异或结果为0,且按位异或满足交换律    #应用 : 交换两个变量的值
    取反 : ^    #取反操作,是直接对存储在内存中的补码进行取反,因此要获得数字本身,还需将其转换成原码之后,再计算
    左移 : <<    #将二进制整体左移n位,缺位补0,相当于原来的数字乘以2^n
    右移 : >>    #将二进制除了符号位之外整体右移n位,缺位按照符号位的取值进行补齐,相当于原来的数字乘以2^n
        #注 : 左移或右移操作均是对补码进行操作
案例一 : 交换变量的值
    方法一 :
       int num1 = 32;
       int num2 = 21;
       int temp = num1 + num2;
       num1 = temp - num1;
       num2 = temp - num1;
    方法二 :
        int num1 = 32;
        int num2 = 21;
        int temp = num1 ^ num2;
        num1 = temp ^ num1;
        num2 = temp ^ num1;
案例二 : 进制转换 :
    方法一(正序打印,完全按照其在内存的存储方式进行显示) :
        void printBin(int num);
        int num = 3;    
        printBin(num);
        void printBin(int num)
       {
          int delta = 31;
          for (int i = delta;i >= 0;i--)
          {
             int result = (num >> i) & 1;
             printf("%i",result);
        
             if (i % 4 == 0)
             {
                 printf(" ");
             }
          }
       printf("\n");
       }
    方法二(逆序打印) :
        void printBin(int num);
        int num = 3;
            printBin(num);
            void printBin(int num)
            {
                int delta = 0;
                for(int i = delta;i < 32;i++)
               {
                    if (i % 4 == 0)
                   {
                       printf(" ");
                   }
                   int result = (num >> i) & 1;
                   printf("%i",result);
               }
               printf("\n");
            }
            #以上两种方法的缺陷 : 当数字较少,会打印大量无用的0
            方法三(改进) :
             void printBin(int num);
             int num = -4;
             printBin(num);
             void printBin(int num)
            {
                int count = 0 ;
                while((num >> count) != 0)
                {
                     int result = (num >> count) & 1;
                     printf("%i",result);
                     count++;
                }
                printf("\n");
           }
*/

网站栏目:C语言之进制转换
URL标题:http://csdahua.cn/article/jihsjs.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流