回 帖 发 新 帖 刷新版面

主题:一个变相的十进制转换成二进制的程序

它应该比一般人所用的连续取模法快.
通过改变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个回复)

沙发

"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 */
}

板凳

你的不怎么看的明白!!
我还是爱这样写!
#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 楼

这是C++ 的啊?

4 楼

1楼讲的没错.我打字时经常会出错.就是上面的"例程"我也打成了"便程".但对于认真看程序的人来说,这是没什么问题的.

回2楼,我这个是用联合体和位域结合来实现的.在联合体内,a,b引用同一个地址,因此无论什么时候怎样修改它们的值,始终a=b.而b的数据类型是一个结构体类型,这个结构体有些特殊,它的每一个成员都被指定了占位空间(例程因为要得到每个bit上的值,所以每个成员占1位.这样b的每一个成员相当于a的每一个位.这就是位域结构(还是位段结构,我记不清了,反正差不多).就写成了type var:occupy_bits的形式,修改occupy_bits可以修改某成员占用位宽(但不是随便设置的).
好多C语言书籍都没有涉及这种结构,尤其是那些专为二级考试设计的书!!!但大多数大学计机专业教材应该有这方面的内容.

5 楼

好!真觉!最好能做到对于任何长度大小的数字,包括整型,浮点型都可以适用!

6 楼

有点巧
我现在是看完一本《最新C语言程序设计》了,对里面的内容也理解得差不多了,就是有时候吧,看到一个问题,看起来很简单,想想自己用C语言可以很轻松的实现,可是真正到写代码的时候到算法这一步就不知道什么实现了,-----比如前几天我的(关于鸡兔同笼的问题)我想可能是我的数学底子薄,我只有中专水平,我没读过高中,也没有进过大学,我也不知道怎样加强这方面的学习???

7 楼

非常感谢大家对我的关注和认可!![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 楼

如何将十六进制数转换为十进制数
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 楼

的确是一个新思路,z支持楼主!

10 楼

能详细的说说这句话吗?总想成了分成n次:
目标数长nByte,就要先用类似楼顶的算法把它拆分至n段1Byte长的数.但这不意味着nByte长就要拆分n次(这就是我所说用递归算法的原因),比如对于一个(m*n)Byte长的目标数,可以先把它拆分成m段nByte长的数,再把每段数拆分成n段1Byte长的数

我来回复

您尚未登录,请登录后再回复。点此登录或注册