进制转换与位运算

数制转换

将任一整数转换为二进制形式。

*问题分析与算法设计
将十进制整数转换为二进制的方法很多,这里介绍的实现方法利用了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)));}}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值