
1010 0100 0010 1101
左移8次
1010 0100 0010 1101 0000 0000
右移K次 (从右往左消数字,直接砍掉,有去掉后面几位的意思,也可以说除以2)
比如
1010 0100 0010 1101
右移2位 就是 10 1001 0000 1011
右移10位 就是 10 1001
16位的数 移动超过16位 就是0了
| 运算符 两数相碰,非0为真
0101
1100
----
1101 (结果)
--------------------------------------
再看此题
a<<k | a>>32-k
可以看成
int tt1 = a<<k
int tt2 = a>>32-k
int tt3 = tt1 | tt2
我们输入一个大一点16进制数0xA42D
转换成2进制,别说你不会,A(1010) 4(0100) 2(0010) D(1101)
1010 0100 0010 1101
我们左移7次,看看效果
1010 0100 0010 1101 先加7个0
1010 0100 0010 1101 000 0000
我们把位置重新调整一下
TT1 = 0101 0010 0001 0110 1000 0000
已经变成0x521680(十六进制) = 5379712(十进制)
在看TT2是右移动32-7个位置,也就是说移动25位,我们没有那么大,就是0了
TT3是两个数做"|"运算
0101 0010 0001 0110 1000 0000
0000 0000 0000 0000 0000 0000
结果
0101 0010 0001 0110 1000 0000
以前写的64位加法及10进制输出,增加了对负数打印支持。参考一下吧。dseg segment
a db 9,2,3,4,5,6,7,80H
db 8 dup (0)
b db 255,5,4,4,3,3,2,1
db 8 dup (0)
c db 8 dup (0)
db 8 dup (0)
t db 8 dup (0)
db 8 dup (0)
flag db 0
dseg ends
cseg segment
assume cs:cseg, ds:dseg
start:
mov ax, dseg
mov ds, ax
lea si, a
lea di, b
call x64_add
call x64_print
mov ax, 4c00h
int 21h
[si] = [si] + [di]
x64_add proc near
mov cx, 8
xor ax, ax
xor bx, bx
clc
xa0:
mov al, [si+bx]
adc al, [di+bx]
mov [si+bx], al
inc bx
loop xa0
ret
x64_add endp
copy [si] to [di]
x64_copy proc near
push ax
push cx
push bx
mov cx, 4
mov bx, 0
cp0:
mov ax, [si+bx]
mov [di+bx], ax
inc bx
inc bx
loop cp0
pop bx
pop cx
pop ax
ret
x64_copy endp
cmp [di]==0
==0, flag=1
x64_cmp0 proc near
push di
push cx
mov cx, 4
mov flag,0
cmp0:
mov ax, [di]
cmp ax, 0
jnz cmp1
inc di
inc di
loop cmp0
mov flag, 0
jmp cmp2
cmp1:
mov flag, 1
cmp2:
pop cx
pop di
ret
x64_cmp0 endp
abs() function
source-[si], target-[si]
x64_abs proc near
mov bx, 7
mov al, [si+bx]
test al, 80H
jz absexit
abs0:
mov al,[si+bx]
not al
mov [si+bx], al
dec bx
jnl abs0
inc al
mov [si], al add 1 to last byte
absexit:
ret
x64_abs endp
print [si] in decimal
x64_print proc near
lea di, t copy [si] to temp variable t
call x64_copy
mov al, [di+7]
test al, 80H
jz print0
mov ah,0eh
mov al,'-'
int 10h
lea si, t
call x64_abs
print0:
xor cx, cx
mov dl, 10
div0:
xor ah, ah
mov bx, 7
div1:
mov al, [di+bx]
cmp ax, 0
jz div2
div dl
mov [di+bx], al
div2:
dec bx
jns div1
mov al, ah
xor al, 30h
mov ah, 0eh
push ax
inc cx
call x64_cmp0
cmp flag, 0
jnz div0
div3:
pop ax
int 10h
loop div3
ret
x64_print endp
cseg ends
end start
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)