进制和位运算的基本知识:

进制和位运算的基本知识:
十进制:0-9,满10进1.
八进制:0-7,满8进1,用0开头表示.
十六进制:0-9,A-F,满16进1,用0x开头表示.
二进制:8个位(二进制)表示一个字节,一个字节最大是255
3位二进制表示1位就是8进制(因为三个二进制位最大的数是7)
4位二进制表示一位就是16进制(因为四个二进制位最大的数是15)
规律:进制越大表现形式越短




十进制-->二进制:
原理:对十进制进行除二运算(见图十进制变二进制)
二进制-->十进制
原理:二进制乘以二的过程
1 1 0
0*2(0)+1*2(1)+1*2(2)=6;
快捷算法:
0 1 1 0 1 0 1
64 32 16 8 4 2 1
0+ 32+ 16+ 0+ 4+ 0+ 1=53;
二进制的加法运算:
5+4=9:
1 0 1+
1 0 0
_________________
2(10) 0 1 ---满二进一,零减一等于一(将零当二使)
_________________
1001-->9
二进制的乘法运算:
5*4=20:
1 0 1
1 0 0
_________________
  000
 000
101
_________________
1010000-->20




其他进制的转换
二进制-->十六进制(四个二进制位就是十六进制位)
90(十进制)
0101 1010
5 10(A) ---16进制中10(A)11(B)12(C)13(D)14(E)15(F),满16进一
0X5A
二进制-->八进制
90
01 011 010
1 3 2 ---八进制的表示(0-7),满7进1




负数的二进制的表现形式:
二进制的正数变成负数:
6-->110
-6:其实就是6的二进制取反+1
取反:将二进制的一变成零,零变成一
0000-0000 0000-0000 0000-0000 0000-0110
取反:
1111-1111 1111-1111 1111-1111 1111-1001+
0000-0000 0000-0000 0000-0000 0000-0001
________________________________________
1111-1111 1111-1111 1111-1111 1111-1010




左移<<:(整数在内存中32位)
3<<2=12
0000-0000 0000-0000 0000-0000 0000-0011
向左移动2位
00-0000 0000-0000 0000-0000 0000-001100-->12 ---最低位补零


右移>>:
6>>2=1:
0000-0000 0000-0000 0000-0000 0000-0110
向右移动2位:
000000-0000 0000-0000 0000-0000 0000-01-->1 ---最高位是零补零,是一补一


规律:
3<<2 --> 3*2(2)=12
3<<3 --> 3*2(3)=24
6>>1 --> 6/2(1)=3
6>>2 --> 6/2(2)=1
左移:a<<b -->a*2(b):就是乘以2的移动位数次幂
右移:a>>b -->a/2(b):除以2的移动位数次幂


无符号右移>>>:
无论右边为零还是一都补零;


>>:最高位补什么由原有数据的最高位值而定
如果最高位0,右移后,用0补空位
如果最高位1,右移后,用1不空位
>>>:无论最高位是什么,右移后,都用0补




与&:
6&3=2
110 &
011
______
010-->2 ---0为假,1为真


或|:
6|5=7
110 |
101
______
111-->7


异或^:
6^5=3
110 ^
101
_____
011-->3


取反


正数-->负数:取反+1
负数-->正数:取反-1


一个数同时异或同一个数两次,结果等于它本身


两个变量互换位置(使用位运算):
int a=2;
int b=3;
a=a^b;
b=a^b;//(a^b)^b
a=a^b;//a^(a^b)


计算机在将二进制转换成十六进制(每次取最低四位):
0000-0000 0000-0000 0000-0000 1110-0110 & 15
0000-0000 0000-0000 0000-0000 0000-1111
_________________________________________
0000-0000 0000-0000 0000-0000 0000-0110-->6


0000-0000 0000-0000 0100-1100 1110-0110  >>4
___________________________________________
0000-0000-0000 0000-0000 0100-1100 1110 &15
0000-0000 0000-0000 0000-0000 0000-1111
_______________________________________
0000-0000 0000-0000 0000-0000 0000-1110-->14\
当为负数时用>>>4;


将一个大于9的数转化为16进制:
如12-->'C'
12-10+'A'='C'
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个需要仔细思考和编写的任务,需要具备汇编语言的基础知识和编程能力。以下是一个汇编语言程序示例,实现了三个十六二进制数相加运算,并考虑了进的情况。请注意,这是一个示例程序,可能需要根据实际情况进行修改和优化。 ``` ; 三个十六二进制数相加运算,计算X+Y+Z=? ; X, Y, Z为16二进制数,存放在寄存器AX, BX, CX中 ; 使用ADC指令,把进C加到结果的高16中 .model small .stack 100h .data X dw 0FFFFh Y dw 0FFFFh Z dw 0FFFFh .code main proc ; 把X, Y, Z分别存放到AX, BX, CX中 mov ax, X mov bx, Y mov cx, Z ; 把AX, BX相加,结果存放到AX中 add ax, bx ; 把CX加到AX中,考虑进的情况 adc ax, cx ; 结果存放在AX中 ; AX的高16为进的结果,低16为加法的结果 ; 把结果存放到DX, BX中 mov bx, ax mov dx, ax ; 把进的结果存放到DX的高16 shr dx, 16 ; 进结果加到BX的高16 add bx, dx ; 结果存放在DX, BX中 ; DX的高16为进的结果,低16为加法的结果 ; 打印结果 mov ah, 2 mov dl, 'H' int 21h mov ax, bx call print_hex mov ah, 2 mov dl, 'H' int 21h mov ax, dx call print_hex ; 退出程序 mov ah, 4ch int 21h main endp ; 打印16十六进制数 print_hex proc push bx push cx push dx mov bx, 10h mov cx, 4 print_loop: rol ax, 4 mov dl, ah and dl, 0fh cmp dl, 0ah jl print_digit add dl, 7h print_digit: add dl, 30h mov ah, 2 int 21h loop print_loop pop dx pop cx pop bx ret print_hex endp end main ``` 对于任务二,需要编写一个程序将指定的内存中给定的几个十进制BCD码数转换为二进制数。具体实现方法可以参考以下步骤: 1. 从内存中读取BCD码数,存放到寄存器中 2. 把BCD码数转换为二进制数,存放到另一个寄存器中 3. 把结果存放到内存中 以下是一个汇编语言程序示例,实现了上述步骤。请注意,这是一个示例程序,可能需要根据实际情况进行修改和优化。 ``` ; 把指定的内存中给定的几个十进制BCD码数转换为二进制数 ; 内存地址为OFFSET,BCD码数长度为LENGTH ; 转换后的二进制数存放在OFFSET + LENGTH中 .model small .stack 100h .data OFFSET dw ? LENGTH dw ? .code main proc ; 从内存中读取BCD码数,存放到寄存器中 mov si, OFFSET mov cx, LENGTH mov ah, 0 mov al, [si] inc si sub al, 30h mov bl, al bcd_loop: mov al, [si] inc si sub al, 30h aam mov ah, al mov al, ah add al, 6 mov ah, bl mul ah add bl, al loop bcd_loop ; 把BCD码数转换为二进制数,存放到另一个寄存器中 mov dx, 0 mov ax, bx mov bx, 10h div bx mov cx, ax mov ax, dx mov dx, 0 mov bx, 10h div bx shl ah, 4 add ah, cl mov cl, al mov al, dl mov ah, 0 mov dx, ax ; 把结果存放到内存中 mov di, OFFSET mov [di + LENGTH], dx ; 退出程序 mov ah, 4ch int 21h main endp end main ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值