wapj152321 发表于 2021-12-7 14:13

易语言无符号右移/逻辑右移模块

易语言无符号右移/逻辑右移模块



汇编语言中SAR和SHR指令的区别
1、方向不同通过gdb动态调试得到每次循环的值进行比对,才发现出现错误的具体原因。sar在符号位为1时,右移时填充1,符号位为0时填充0。而python默认的右移运算为逻辑右移运算,右移时默认填充0,与符号位无关。
2、作用不同
汇编语言中SAR和SHR指令都是右移指令,SAR是算数右移指令(shift arithmetic right),而SHR是逻辑右移指令(shift logical right)。SAR右移时保留操作数的符号,即用符号位来补足,而SHR右移时总是用0来补足。例如10000000算数右移一位是11000000,而逻辑右移一位是01000000。3、顺序不同SAR是算术右移,比较特殊。他的最高位一直是不变的。如1000 0000算术右移7位后就成了1111 1111。SAR右移的时候,最高位不变,最低位移入CF。


易语言位操作【右移】为算术右移,相当于SAR,若想实现SHR右移指令,可以采用以下办法



.版本 2


.子程序 右移_逻辑, 长整数型, , ※易语言无符号右移/逻辑右移模块
.参数 x, 长整数型, , ※参数_右移数值   长整数型
.参数 y, 整数型, , ※参数_右移长度   整数型
.局部变量 s, 长整数型
.局部变量 w, 长整数型
.局部变量 d, 长整数型


' 2021年12月7日来源于互联网
s = 右移 (x, y)
w = 左移 (取字节集长度 (到字节集 (s)), 3)
d = 位与 (s, 位取反 (左移 (-1, w - y)))
返回 (d)

















幽溪左畔 发表于 2022-6-26 21:34

测试 33 >>> 0 结果为0正确为 33
下面的代码没问题
.版本 2

.子程序 逻辑右移, 整数型, 公开, 无符号(逻辑)右移左边补0,有符号(算数)右移左边补符号位
.参数 欲移动的整数, 整数型, , 易语言自带的右移为有符号右移,与无符号右移计算结果不同
.参数 欲移动的位数, 字节型, , 右移范围0~31

置入代码 ({ 102, 81, 139, 69, 8, 138, 77, 12, 211, 232, 102, 89, 201, 194, 8, 0 })
' push cx
' mov eax,
' mov cl,
' shr eax,cl
' pop cx
' leave
' retn 8
返回 (0)

来自互联网
页: [1]
查看完整版本: 易语言无符号右移/逻辑右移模块