进制转换与位运算

来源:互联网 发布:sql分组查询所有数据 编辑:程序博客网 时间:2024/09/21 08:58
数制转换将任一整数转换为二进制形式。*问题分析与算法设计将十进制整数转换为二进制的方法很多,这里介绍的实现方法利用了C语言能够对位进行操作的特点。对于C语言来说,一个整数在计算机内就是以二进制的形式存储的,所以没有必要再将一个整数经过一系列的运算转换为二进制形式,只要将整数在内存中的二进制表示输出即可。比如,数字14的二进制表示为00000000000000000000000000001110,先用10000000000000000000000000000000与它进行与运算,判断第32位是否为1,依次下去,判断第31位,第30位,…………,计算到第4位时,与运算结果为00000000000000000000000000001000,表示数字14的二进制形式在该位为1,然后,把与运算的结果右移3次,使之得到结果1,再加上0的ASC值,结果为49,即1的ASC值,putchar()输出1。这样实现从高位到低位的二进制输出。*程序说明与注释#include <stdio.h>void main(){void printb(int,int);int x;printf("Input number:");scanf("%d",&x);printf("number of decimal form:%d\n",x);printf("it's binary form:");printb(x,sizeof(int)*8);//x:整数,sizeof(int):int型在内存中所占的字节数,sizeof(int)*8:int型对应的位数putchar('\n');}void printb(int x,int n){if(n>0){putchar('0'+((unsigned)(x&(1<<(n-1)))>>(n-1)));/*for(n=5;n>0;n-=1)printf("%d ",(4&1<<(n-1))>>(n-1));
//输出第n位

4即是100,1先变为10000,&运算,结果为00000,0
第二步,1先变为1000,结果为0,
第三步,100,结果为100,右移动2位,为1,
第四步,10,结果为0,
第五部,同样为0,
输出结果为00100
最后,只能先变大,即左移,先右移的话,高位为零,不能进行计算,
如同:for(n=5;n>0;n-=1)


printf("%d ",(4&1>>(n-1))<<(n-1));
第一步:4-->100,1为00001,结果为0,
第二步:1为0001,结果为零,一次下去
结果为00000;
*/printb(x,n-1);//归调用,输出x的后n-1位}}*运行结果输入:8输出:number of decimal form:8it's bunary form:0000000000001000输入:-8输出:number of decimal form:-8it's binary form:1111111111111000输入:32767输出:number of decimal form:32767it's binary form:0111111111111111输入:-32768输出:number of decimal form:-32768it's binary form:1000000000000000输入:128输出:number of decimal form:128it's binary form:0000000010000000*问题的进一步讨论充分利用C语言可以对位进行操作的特点,可以编写许多其它高级语言不便于编写甚至根本无法编写的程序。位操作是C语言的一大特点,在深入学习C语言的过程中应力求很好掌握。程序中使用的位运算方法不是最佳的,也可以不用递归操作,大家可以自行对程序进行优化。如把递归改为for循环。void printb(int x,int n){for(;n>0;n--){putchar('0'+((unsigned)(x&(1<<(n-1)))>>(n-1)));//输出第n位}}*思考题将任意正整数转为四进制或八进制数。*问题分析与算法设计根据上一道题的分析,同时经过数字转换发现二进制数和四进制数有一定转换规律,把二进制数从地位到高位,每2位数为一组,就能转换为相应四进制数每一位的数字,比如十进制数14,它的二进制数为1110,四进制数为32。根据这个规律,修改转换函数,把用来比较的二进制数改为11(即根据前面分析的,每2位数分一组),把每次移动位数设为2。即可实现四进制的转换。同理,正整数转换为八进制数,需要把用来比较的二进制数改为111(每3位数分一组),每次移动位数为3,但要注意对齐问题。*程序说明与注释#include <stdio.h>void main(){void printq(int,int);int x;printf("Input number:");scanf("%d",&x);printf("number of decimal form:%d\n",x);printf("it's binary form:");printq(x,sizeof(int)*8);//x:整数,sizeof(int):int型在内存中所占的字节数,sizeof(int)*8:int型对应的位数putchar('\n');}void printq(int x,int n)//四进制转换{for(;n>0;n=n-2){putchar('0'+((unsigned)(x&(3<<(n-2)))>>(n-2)));//注意,这里不能写11,要写二进制为11的数,即十进制的3。}}#include <stdio.h>void main(){void printo(int,int);int x;printf("Input number:");scanf("%d",&x);printf("number of decimal form:%d\n",x);printf("it's binary form:");printo(x,sizeof(int)*8);//x:整数,sizeof(int):int型在内存中所占的字节数,sizeof(int)*8:int型对应的位数putchar('\n');}void printo(int x,int n)//八进制转换{for(n=n+1;n>0;n=n-3)//初始值要修改,否则,移位到最后位置不能对齐{putchar('0'+((unsigned)(x&(7<<(n-3)))>>(n-3)));}}