精华内容
下载资源
问答
  • 【汇编】进制数补码并转二进制和十六进制输出(多组输入输出,使用宏库文件) 代码如下,有详细注释 Include macro_lib.MAC data segment string db 10,?,10 dup(?) ;用于存放输入的十进制数 这里十进制数在-...

    【汇编】求十进制数的补码并转二进制和十六进制输出

    (多组输入输出,使用宏库文件)

    代码如下,有详细注释

    Include macro_lib.MAC
    data segment
        string db 10,?,10 dup(?) ;用于存放输入的十进制数 这里十进制数在-32768~32767之间(16位有符号数)
        ;可以出现负数,此程序功能为用二进制和十六进制显示这个十进制数的补码
    data ends
    
    code segment
        assume cs:code ,ds:data
    
    
    
        ;输入多个十进制数,输入q字符(ascii码为113)结束程序
    start:
        sta: inputs string ;调用宏指令库中的输入字符串
        crlf ;回车换行
        ;第一位有三种情况 
        ;1.0~9  转正数处理  ascii码为48~57
        ;2.'-'  转负数处理  ascii码为45
        ;3.'q'  退出        ascii码为113
        ;下面取第一位
        lea bx,string
        add bx,2
        mov cl,[bx] ;借助cl
        cmp cl,113
        JZ ex ;如果ZF=1,即输入为q则结束程序
        cmp cl,45
        JZ nega ;如果ZF=1,即输入为负数
    
    
    
    
    ;bx是string 的偏移地址
    ;正数,没有跳ex和nega  
    posi:  
    sub bx,2
    mov cx,0
    mov cl,[bx+1];cx存放实际串长
    ;cx+1指向串最后一位
    mov ax,1;初始权值为1
    mov bx,0;bx存放值
    mov dx,10;常量
    lp1:
    push dx
    mov dh,0;高位置0
    push bx
    mov bx,cx
    mov dl,[bx+1];将当前位置的ascii码给dl,由于是数字为48~57
    pop bx
    sub dl,48;转为数值,dx为数字
    push ax;保留当前权值
    mul dx;数字乘以当前权值,结果低位在ax中,高位在dx中,即dx这里会被0覆盖(数比较小)
    ;但没关系,会pop,即只有ax的数值有用 
    add bx,ax
    pop ax
    mov dx,10;
    mul dx
    pop dx ;dx再恢复10 此时ax权值已经在以前基础上*10了
    loop lp1 ;loop进行前会对cx--,不为零则循环
    ;循环结束,bx为所求值,由于正数的补码是其本身,下面直接输出二进制和十六进制即可
    
    ;2进制
    mov cx,16;循环16次
    shift1:
    rol bx,1
    mov al,bl
    and al,01h ;取最右1位
    add al,30h  ;转为ascii码
    putchar al  ;输出al中的ascii码对应的字符 0/1
    loop shift1 ;循环16次后bx不变
    put3space ;输出3个空格
    ;16进制
    mov cx,4;循环4次
    shift2:
    rol bx,1
    rol bx,1
    rol bx,1
    rol bx,1
    mov al,bl
    and al,0fh ;取最右四位
    add al,30h  ;转为ascii码
    cmp al,39h
    jle dig1 ;是0~9 则转dig
    add al,7 ;是A~F
    dig1:   
    putchar al  ;输出al中的ascii码对应的字符
    loop shift2 ;循环4次后bx不变
    ;输出回车换行
    crlf
    jmp sta;再次输入
    
    
    
    
    ;负数
    nega:
    sub bx,2
    mov cx,0
    mov cl,[bx+1];cx存放实际串长
    dec cx
    ;cx+2指向串最后一位
    mov ax,1;初始权值为1
    mov bx,0;bx存放值
    mov dx,10;常量
    lp2:
    push dx
    mov dh,0;高位置0
    push bx
    mov bx,cx
    mov dl,[bx+2];将当前位置的ascii码给dl,由于是数字为48~57
    pop bx
    sub dl,48;转为数值,dx为数字
    push ax;保留当前权值
    mul dx;数字乘以当前权值,结果低位在ax中,高位在dx中,即dx这里会被0覆盖(数比较小)
    ;但没关系,会pop,即只有ax的数值有用 
    add bx,ax
    pop ax
    mov dx,10;
    mul dx
    pop dx ;dx再恢复10 此时ax权值已经在以前基础上*10了
    loop lp2 ;loop进行前会对cx--,不为零则循环
    ;循环结束,bx为所求值的正直,下面求其补码,并以二进制和十六进制输出
    ;由于是负数,所以其补码是各位取反  由于高位是0  所以也要取反 所以
    ;各位异或1
    xor bx,0FFFFH
    add bx,1
    ;现在bx为补码了,下面直接输出二进制和十六进制即可
    
    ;2进制
    mov cx,16;循环16次
    shift3:
    rol bx,1
    mov al,bl
    and al,01h ;取最右1位
    add al,30h  ;转为ascii码
    putchar al  ;输出al中的ascii码对应的字符 0/1
    loop shift3 ;循环16次后bx不变
    put3space   ;输出3个空格
    ;16进制
    mov cx,4;循环4次
    shift4:
    rol bx,1
    rol bx,1
    rol bx,1
    rol bx,1
    mov al,bl
    and al,0fh ;取最右四位
    add al,30h  ;转为ascii码
    cmp al,39h
    jle dig2 ;是0~9 则转dig
    add al,7 ;是A~F
    dig2:   
    putchar al  ;输出al中的ascii码对应的字符
    loop shift4 ;循环4次
    ;输出回车换行
    crlf
    jmp sta;再次输入
    
    ex: mov ah,4ch
        int 21h
    code ends
        end start


    macro_lib.MAC

    cr equ 13
    lf equ 10
    spa equ 32
    getchar macro
            mov ah,1
            int 21h ;al为输入字符
            endm
    putchar macro asc   
            mov ah,2
            mov dl,asc;输出dl上的字符
            int 21h
            endm
    inputs  macro conbuf    
            mov ah,10
            mov dx,offset conbuf    ;ds:dx为缓冲区的首地址  其分别存放缓冲区大小(字节数)、实际填充数、串内容
            int 21h
            endm        
    prints  macro msg
            mov ah,9
            mov dx,offset msg;  DS:DX为串地址,字符串应以'$'结尾
            int 21h
            endm
    crlf    macro
            putchar cr ;回车19d  13H  
            putchar lf ;换行16d  10H
            endm
    
    put3space macro
            putchar spa
            putchar spa
            putchar spa
            endm
    
    exit    macro 
            mov ah,4ch
            int 21h
            endm
    
    


    运行效果截图
    这里写图片描述

    展开全文
  • 以 VHDL程序—输入带符号的4位二进制数补码 为例 前言 作者使用的是quartus Ⅱ9.0(32 Bit) 创建一个VHDL程序步骤 1、选择File->new project wizard 2、选择new project wizard后,点击next后填写项目名称...

    以 VHDL程序—求输入带符号的4位二进制数的补码 为例

    前言

    作者使用的是quartus Ⅱ9.0(32 Bit)

    创建一个VHDL程序步骤

    1、选择File->new project wizard
    在这里插入图片描述
    2、选择new project wizard后,点击next后填写项目名称(不要出现空格)
    在这里插入图片描述
    3、File name可以不写(一般默认不写)
    在这里插入图片描述
    4、选择硬件型号,看电路板上的芯片型号选即可,当然不需要用到电路板的也可以不选,直接点击next跳过。
    在这里插入图片描述
    5、之后一直next,后finish。
    在这里插入图片描述
    6、接着,选择File->new->VHDL File
    在这里插入图片描述
    7、在空白这你就可以编写自己的VHDL程序了!
    在这里插入图片描述
    8、编写好VHDL程序后,先保存
    在这里插入图片描述
    9、点击开始编译
    在这里插入图片描述
    10、可能会出现的问题,实体名和项目名不一致、17和18行datain和前面第五行的data_in不一致
    在这里插入图片描述11、把之前的实体名assignment_419改成现在的项目名test,datain改成data_in,即可编译成功
    在这里插入图片描述
    在这里插入图片描述
    12、模拟程序输入输出,选择File->new->Vector Waveform File
    在这里插入图片描述
    13、该VHDL程序为求输入的4位二进制数的补码,补码的求法为正数的补码为它原码(如:某一正数原码为0101,那么它的补码也为它的源码0101),负数的补码是其原码取反加一(如:某一负数的原码为1101,那么它的补码是1010+1=1011),设置变量,提前设好输入值。注意:变量名要填写正确!
    在这里插入图片描述
    14、结果如下
    在这里插入图片描述

    展开全文
  • 于是3进制的补码二进制的转换过程一样。 (1)先的10的3进制表示为0101; (2)对10的3进制表示形式取反为2121; (3)对取反后的三进制表示形式加1位等于2122; 十进制-10的二进制补码: 原码:...

     

    补码=反码+1,计算机中,用补码来表示负数。

    (1)用0,1,2表示;
    (2)遇3进位;
    于是3进制的数的补码同二进制的转换过程一样。
    (1)先求的10的3进制表示为0101;
    (2)对10的3进制表示形式取反为2121;
    (3)对取反后的三进制表示形式加1位等于2122;

     

    十进制-10的二进制补码:

    原码:00001010

    反码:11110101

    补码:11110110

    十进制-10 (等于) 二进制11110110

     

    展开全文
  • 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 整数二进制求法: 十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成...

    题目描述:

     

    输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。


    整数二进制求法:

    十进制转成十六进制:  Integer.toHexString(int i) 
    十进制转成八进制  Integer.toOctalString(int i) 
    十进制转成二进制  Integer.toBinaryString(int i) 
    这3个函数都可以将十进制的整数转换成二、一六、八进制数   不过转换后的结果都是字符串的形式 

    负数的( 32位 )补码:

    思路:求负数的补码的方法。 注意: 负数的补码是在其原码的基础上,符号位不变,其余位取反,然后加1


    代码:

    public class Solution {
    	
    	private int num;
    	private boolean flag = true;
    	private int target;
    	
        public int NumberOf1(int n) {
        	target = n;
        	if (n >= 0) {
    			char c[] = Integer.toBinaryString(n).toCharArray();
    			for (int i = 0; i < c.length; i++) {
    				if (c[i] == '1') {
    					num++;
    				}
    			}
    			return num;
    		}else {
    			return printComplementCode(n);
    		}
        }
        
        private int printComplementCode(int a)
        {
            for (int i = 0; i < 32; i++)
            {
                // 0x80000000 是一个首位为1,其余位数为0的整数
                int t = (a & 0x80000000 >>> i) >>> (31 - i);
            	if (t == 1) {
    				num++;
    			}
            }
        	return num;
        }
    }

    参考:

    进制转换

    负数补码求法


    欢迎关注我获得跟多资讯~

    展开全文
  • 今天看了《逻辑设计基础》才明白了为什么二进制负数的补码是符号位不变,其他位取反加一 1. 什么是补码补码:计算机是用来将减法转换成加法的一种手段,在计算机系统中,数值一律用补码来表示和存储。 2. 如何...
  • 实现方法: 先上操作,python里面的负数直接将其和 0xffffffff 进行 与(&...输入一个整数,输出该32位二进制表示中1的个数。其中负数用补码表示。 题解python代码: class Solution: def NumberOf1(self, n)
  • 这是我在书上看到的代码 module buma(ain,yout); input [7:0] ain; output [7:0] yout; assign yout = ~ain+1; endmodule 正数的补码不是本身吗,这样写是不是有问题
  • 直接上例子(以4bit为例) 七伤拳口诀:左右找一,中间取反 -2: 先用带符号表示:1010 补码:1110 -5: 带符号表示:1101 补码:1011 -6: 带符号表示:1110 补码:1010 问:会了么? ...
  • 我想C#语言写的的16进制显示的字符串与二进制补码相互转换函数
  • 汇编8086实现 输入一个二进制补码数,输出其对应的十进制数。跪大神,源码!跪谢!
  • 二进制补码求其整数值原则:先原码,再求二进制的真值,然后转换成十进制数。1、原码,判断补码的最高位是0还是1,若是0,表示正数,则原码同补码;若是1,表示负数,则最高位(即符号位)仍为1,其余各位...
  • 例如-25的补码 拿到这个数字,我们先不看符号,把这个数字转化成二进制 25的二进制为11001,然后这里用8位二进制,所以我们在11001前面加上两个0,变成0011001,最后再加上符号位(正数为0,负数为1),因此为...
  • 2:负整数的二进制补码:先与该负数相对应的正整数的二进制代码,然后所有位取反加1,不够位数时左边补1,例如,-3的二进制补码,先3的二进制补码,3=11,取反之后为00,加1之后为01,假设用八位二进制表示...
  • 为什么要讲这个简单的问题,就是因为看到了一些比较玄乎的表达方式,归根到底也能得到二进制的原码和补码表示,但就是看着难受,为此,为了让自己不被同化,记录下最简单的求二进制原码和补码的方式。 数字信号处理...
  • 基于quartus ii求补码的VHDL程序(输入是带符号的4位二进制数) 代码: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.STD_LOGIC_ARITH.all; entity complement is port( ...
  • 二进制补码、反码

    2017-08-29 13:48:00
    本博客介绍如何求二进制数的原码、补码、反码。 对于正数来说,原码,反码,补码都是一样的。 对于负数,即二进制最高为1 求补码: 从数的右边往左开始数,遇到“0”不理它,直到遇到第一个“1”为止(不包括这个1)...
  • 反码:将二进制数按位取反 补码:反码加一 负数从真值求补码 先求出其原码 求其反码 反码加一 如求-20的补码 其原码为00010100;其反码为11101011;其补码为11101100 负数从补码求真值 补码减一 求其
  • 例如数学上,1+(-1)=0,而在二进制中00000001+ 10000001=10000010,换算成十进制为-10,错误。 但是采用他们的补码:00000001+11111111=00000000. 则可以进行正常的直接加减运算。 所以:对于求补码问题。 正数
  • 首先要理解整数在机器内是如何用补码表示的:原码、补码、反码按位运算,就是对一个(常量或变量)的二进制位与另一个的对应二进制位进行运算。位运算有:& 位逻辑与,1&1等于1,1&0等于0,0&1...
  • Python二进制源码补码

    千次阅读 2018-04-25 22:42:57
    假如我的计算机是32位的,接下来要计算~5的值: 5 的二进制表达式为:0000 0000 0000 0000 0000 0000 0000 0101 ...知道一个的“补码”,其值(“源码”)的方法是: 首先看符号位(最左的一位),如果是...
  • 总之就是将十进制数转换为二进制数求补码即为结果。比如:-32第一步:32(10)=00100000(2)第二步:求反:11011111第三步:加1:11100000所以-32(10)=11100000(2)2.计算机中的整数是用补码存储的,最高位为符号位,C...
  • 由来原码: 所谓原码就是机器数,是加了一位符号位的二进制数(因为数值有正负之分),正数符号位为0,负数符号位为1...原码的方法: 正数:将一个十进制正整数转换二进制数(带符号位), 即是这个数的原码.负数:先计算该...
  • 负数的二进制数问题

    2020-11-28 16:40:51
    补码 -1 和 1 的原码是相同的,用补码来为区分-1和1 1.如何一个负数的二进制数? 1.-15的二进制数 解: ①先15的二进制数: ​ 0000 0000 0000 0000 0000 0000 ...1.求二进制数(也就是补码) 1111 1111 1111 111
  • 二进制中 : 1. 位宽不变的情况下, 模 加1等于0. 模表示所有的位数都是1, 例如位宽是2, 模就是11. 模加1就是 11b + 01b = 100b ,但是位宽不变, 只取低二位, 所以就是0 2. 模 = A + A的反码 ( 以下用 ~A 表示) , ...
  • 带符号整数二进制补码表示的最少位数 注:文章为方便说明,规定位宽为16 想要在一个16位的补码中无视多余位,找出可以表示该带符号整数二进制补码的最少位数,我们需要的运用到C语言中一个非常有用的算法思想——拆...
  • 随着人工智能的不断发展,FPGA实现LSTM算法加速成为人工智能的研究热点之一,使用FPGA实现LSTM算法的第一步,就是将LSTM中的矩阵参数变成二进制补码形式,存储到FPGA中,这篇文章主要将如何用python实现求补码操作 ...
  • 二进制补码问题

    2017-01-16 18:24:55
    二进制数在内存中是以补码的形式存在。 符号位:1是负数的符号位,0是正数的符号位。 正数: 用负数的补码用负数的补码源码:符号位不变,末位减1,其余按位反源码:符号位不变,末位减1,其余按位反 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 762
精华内容 304
关键字:

二进制数求补码