輸入十進位制數,顯示其二進位制形式中 1 的個數

2021-07-09 14:59:50 字數 2637 閱讀 1070

;要求:從鍵盤輸入乙個10進製數(不超過2000),然後輸出其二進位制數中 1 的個數。

;程式如下:

;******************************==

disp_str  macro  x     ;巨集定義.

mov  dx, offset x

mov  ah, 9

int  21h

endm

;--------------------------------

data  segment          ;資料段.

msg1 db  13, 10, 'please input : $'

msg3 db  13, 10, 'the n(1)  is : $'

x  dw  ?           ;存放新輸入資料.

data  ends

;--------------------------------i

code   segment         ;**段.

assume   cs: code, ds: data

start:

mov  ax, data

mov  ds, ax

;--------------------------------

in_loop:

disp_str  msg1     ;巨集呼叫,提示 please input :

;--------------------------------

mov  x,  0         ;資料清零.

_inx:

mov  ah, 1         ;輸入字元.

int  21h

;--------------------------------

cmp  al, 13        ;回車?

je   _in_end       ;是則結束輸入.

cmp  al, '0'

jb   in_loop       ;小於'0',不是數字.

cmp  al, '9'

ja   in_loop       ;大於'9',不是數字.

sub  al, '0'       ;變成數字

mov  cl, al

mov  ch, 0         ;cx 就是新輸入的數字.

mov  ax, x

mov  bx, 10        ;老資料乘以10

mul  bx

add  ax, cx        ;加上新資料.

mov  x,  ax        ;儲存.

cmp  ax, 2000      ;與2000比較

ja   in_loop       ;大於,就重新輸入

jmp  _inx          ;不大,就繼續輸入下一位數

;--------------------------------

_in_end:

disp_str  msg3     ;巨集呼叫,提示  the n(1)  is :

mov  ax, 0

mov  bx, x

mov  cx, 16        ;判斷16位數.

dddd:

cmp  bx, 8000h

jb   eeee

inc  ax            ;個數加一.

eeee:

shl  bx, 1         ;左移.

loop dddd          ;cx-1,非零轉移.

;--------------------------------

disp:                  ;以十進位制顯示ax內容

mov  bx,  10

mov  cx,  0

d_1:mov  dx,  0

div  bx

add  dl,  '0'

push dx

inc  cx

cmp  ax,  0

jne  d_1

mov  ah,  2

d_2:pop  dx

int  21h

loop d_2

;--------------------------------

mov  ah, 4ch      ;到此結束

int  21h

;--------------------------------

code  ends

end  start

;******************************==

程式經過編譯、連線後,執行效果如下:

c:\masm>_1_n

please input : 1998

the n(1)  is : 8

c:\masm>_1_n

please input : 536

the n(1)  is : 3

利用計算器,把 1998、536,變成二進位制數,可以看到,它們其中確實是有 8 個和 3 個 1。

大家再試試別的數字,看看做而論道編寫的程式是否正確。

;******************************=

原題**:

提問者對回答的評價:謝謝啊

;******************************=

輸入十進位制數,輸出其二進位制

include using namespace std intmain for i i 0 i return0 輸入乙個正整數,判斷其位數 intdig int num return counter include using namespace std intmain for i i 0 i re...

二進位制轉十進位制

二進位制轉十進位制方法很多,如字元陣列,指標法等 下面用字串函式的方法實現 二進位制轉十進位制 主要用 到 string函式性質及pow求乙個數的n次方的函式過載 by adengou 2010.08.04 win7 dev c 5.0 vs 2010 通過 include include incl...

二進位制與十進位制

人們在生產實踐和日常生活中創造了多種表示數的方法,這些數的表示規則稱為數制。例如人們常用的十進位制 計算機中採用的二進位制等。十進位制計數法的加法規則是 逢十進一 任意乙個十進位制可用0 1 2 3 4 5 6 7 8 9十個字元的組合表示,它的基數是 10。二進位制計數法的加法規則是 逢二進一 任...