主题:一个变相的十进制转换成二进制的程序
URCLLC
[专家分:1080] 发布于 2004-04-25 11:16:00
它应该比一般人所用的连续取模法快.
通过改变a的类型和增加b的成员个数还可以适应更大的十进制值.
union {int a; /*此便程只适用于1Byte以内的数值*/
struct {unsigned int b1:1;
unsigned int b2:1;
unsigned int b3:1;
unsigned int b4:1;
unsigned int b5:1;
unsigned int b6:1;
unsigned int b7:1;
unsigned int b8:1;
}b;
}v;
main()
{printf("Input a decimal number <=255: "); scanf("%d",&v.a);
printf("The binary value is:"%d%d%d%d%d%d%d%d" ,v.b.b8,v.b.b7,v.b.b6,v.b.b5,v.b.b4,v.b.b3,v.b.b2,v.b.b1);
getch(); /*For win2000/xp */
}
回复列表 (共12个回复)
沙发
frank2050 [专家分:30] 发布于 2004-04-25 12:27:00
"The binary value is:"%d%d%d%d%d%d%d%d" 多了一个引号吧?
我认为应该如下:
union {int a; /*此便程只适用于1Byte以内的数值*/
struct {unsigned int b1:1;
unsigned int b2:1;
unsigned int b3:1;
unsigned int b4:1;
unsigned int b5:1;
unsigned int b6:1;
unsigned int b7:1;
unsigned int b8:1;
}b;
}v;
main()
{printf("Input a decimal number <=255: "); scanf("%d",&v.a);
printf("The binary value is:%d%d%d%d%d%d%d%d",v.b.b8,v.b.b7,v.b.b6,v.b.b5,v.b.b4,v.b.b3,v.b.b2,v.b.b1);
getch(); /*For win2000/xp */
}
板凳
不游泳的鱼 [专家分:620] 发布于 2004-04-25 12:43:00
你的不怎么看的明白!!
我还是爱这样写!
#include<iostream.h>
void main()
{ int date,i=0;
int *d=new int[16];
cout<<"十进制数"<<endl;
cin>>date;
do{
d[i]=date%2;
date=date/2;
i++;
}while(date!=0);
for(int j=i-1;j>=0;j--)
cout<<d[j];
cout<<endl;
delete d;}
3 楼
frank2050 [专家分:30] 发布于 2004-04-25 12:49:00
这是C++ 的啊?
4 楼
URCLLC [专家分:1080] 发布于 2004-04-25 14:31:00
1楼讲的没错.我打字时经常会出错.就是上面的"例程"我也打成了"便程".但对于认真看程序的人来说,这是没什么问题的.
回2楼,我这个是用联合体和位域结合来实现的.在联合体内,a,b引用同一个地址,因此无论什么时候怎样修改它们的值,始终a=b.而b的数据类型是一个结构体类型,这个结构体有些特殊,它的每一个成员都被指定了占位空间(例程因为要得到每个bit上的值,所以每个成员占1位.这样b的每一个成员相当于a的每一个位.这就是位域结构(还是位段结构,我记不清了,反正差不多).就写成了type var:occupy_bits的形式,修改occupy_bits可以修改某成员占用位宽(但不是随便设置的).
好多C语言书籍都没有涉及这种结构,尤其是那些专为二级考试设计的书!!!但大多数大学计机专业教材应该有这方面的内容.
5 楼
月光光 [专家分:40] 发布于 2004-05-05 10:59:00
好!真觉!最好能做到对于任何长度大小的数字,包括整型,浮点型都可以适用!
6 楼
goner [专家分:100] 发布于 2004-05-05 13:51:00
有点巧
我现在是看完一本《最新C语言程序设计》了,对里面的内容也理解得差不多了,就是有时候吧,看到一个问题,看起来很简单,想想自己用C语言可以很轻松的实现,可是真正到写代码的时候到算法这一步就不知道什么实现了,-----比如前几天我的(关于鸡兔同笼的问题)我想可能是我的数学底子薄,我只有中专水平,我没读过高中,也没有进过大学,我也不知道怎样加强这方面的学习???
7 楼
URCLLC [专家分:1080] 发布于 2004-05-05 17:35:00
非常感谢大家对我的关注和认可!![em72]
回5楼,理论上,这种方法是不可以达到那个目的的.如果非要达到那个目的,只能用常规的连续取模法.但可以支持有限个数的数据类型(那些数据长度必须是Byte的整数倍,数据长度一样的数,无论是整型还是浮点型,也无论正负,在电脑看来都是一样的).这一点,最好不要在C语言下实现,而要在C++/C#下实现,因为它支持重载,可以传入不同的参数来让子程序判断目标数据的长度.
我说它只能支持有限种数据类型是因为长度每递增一段,就要写一段代码把它们进行拆分,以我的能力,我认为它可以用递归算法以尽量减小代码的数量,但这也不能够达到支持所有长度数据的要求.比如:目标数长nByte,就要先用类似楼顶的算法把它拆分至n段1Byte长的数.但这不意味着nByte长就要拆分n次(这就是我所说用递归算法的原因),比如对于一个(m*n)Byte长的目标数,可以先把它拆分成m段nByte长的数,再把每段数拆分成n段1Byte长的数.[em41]
还有一个解决方向,就是在联合体成员中设置m个位段成员,同时想办法让联合体的另一个成员(在楼顶的程序,就是变量a)的长度与之匹配,这时,它就可以一次通吃任意长度≤m的目标数(如楼顶的程序,对0~8[有效]位数都适用,所以它可以测试0~255范围内的数.以我的能力,办法就是用常规结构体去替换那个变量a,就可以对付如64bit,96bit等超过单个变量容纳范围的数.[em41]
回6楼,我的数学从高中到大学都是及格与不及格各占一半的.我现在学的也不是这方面的专业,我的数学水平其实也很水.[em29]
大家的回贴给我很大的力量,我一定会再接再厉,我的目标是用最简短的代码来说明一个算法思想,而不是用成百上千行代码来说明递归之类的问题.我也是一只不折不扣的菜鸟(虽然见识过VB/C/BCB/ASM,但除VB外没一样是熟练的,ASM就像我的dumb English,只识读不识讲,一讲就出错),我的服务目标是广大的菜鸟们.[em80][em80]
8 楼
houyue [专家分:200] 发布于 2005-04-15 15:37:00
如何将十六进制数转换为十进制数
code segment
assume cs:code
hexidec proc far
push ds
sub ax,ax
push ax
start: call hexibin
cmp al,1bh
jz exit
call crlf
call binidec
call crlf
jmp start
exit: ret
hexidec endp
hexibin proc near
mov bx,0
inhex: mov ah,1
int 21h
cmp al,1bh
jz hexend
sub al,30h
jl hexend
cmp al,10h
jl add_to
sub al,7
cmp al,10
jl hexend
cmp al,16
jl add_to
sub al,20h
cmp al,10
jl hexend
cmp al,16
jge hexend
add_to: mov cl,4
shl bx,cl
mov ah,0
add bx,ax
jmp inhex
hexend: ret
hexibin endp
binidec proc near
mov cx,10000
call dec_div
mov cx,1000
call dec_div
mov cx,100
call dec_div
mov cx,10
call dec_div
mov cx,1
call dec_div
ret
binidec endp
dec_div proc near
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,2
int 21h
ret
dec_div endp
crlf proc near
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
ret
crlf endp
code ends
end hexidec
////////////////////////
看看这个就知道怎么回事啦。
9 楼
Aresgram [专家分:450] 发布于 2005-04-15 16:58:00
的确是一个新思路,z支持楼主!
10 楼
随时随地 [专家分:740] 发布于 2005-04-27 17:27:00
能详细的说说这句话吗?总想成了分成n次:
目标数长nByte,就要先用类似楼顶的算法把它拆分至n段1Byte长的数.但这不意味着nByte长就要拆分n次(这就是我所说用递归算法的原因),比如对于一个(m*n)Byte长的目标数,可以先把它拆分成m段nByte长的数,再把每段数拆分成n段1Byte长的数
我来回复