十进制和二进制的问题,难道这个问题很难吗? ( 积分: 50 )

  • 主题发起人 主题发起人 YuZi
  • 开始时间 开始时间
Y

YuZi

Unregistered / Unconfirmed
GUEST, unregistred user!
如何用一个函数 快速地 取得一个十进制数的二进制值按位求反后的十进制数,比如:
十进制的10,按位取反后返回的是:5, 十进制的100取反后是27,我已经知道可以用
IntToBin BinInverse BinToInt 几个函数实现我要的效果,但是这样效率太低,我想要一个能够高效、快速,最好是汇编代码的一个转化函数,请问谁知道呀?
 
如何用一个函数 快速地 取得一个十进制数的二进制值按位求反后的十进制数,比如:
十进制的10,按位取反后返回的是:5, 十进制的100取反后是27,我已经知道可以用
IntToBin BinInverse BinToInt 几个函数实现我要的效果,但是这样效率太低,我想要一个能够高效、快速,最好是汇编代码的一个转化函数,请问谁知道呀?
 
取反很简单,
不过看样子你的输入输出格式都是字符串,
那就肯定要自己做类型转换,同时处理掉不需要的位
有些东西是省不掉的
not可以直接对数值类型使用
例:
var i:word;
begin
i:=10;
i:=not i;
end
如果你非要用汇编,
那就
i:=10;
asm
not i;
end
不过这样除了可以跟别人说:"我用了汇编!"之外
没有什么不同
至于"效率太低",不知道你现在的效率如何,
要达到什么样的目标才可以,
你需要提供一些具体的速度测试数据,
我们可以再讨论如何提高效率
 
呵呵,不对呀! 十进制 100=十六进制 64 =二进制0110 0100
0110 0100 取反 1001 1011=9B=155 为何你得 27 呀???
 
tswhq:
显然你没有看清他的题意,
我上面已经说了:要处理掉不需要的位
如:10取反得5,显然只对低位4个bit转换,
高位的0全部丢掉的,
你是以1byte,8位全取反来考虑的,
看看3组数字就明白了:
10+5=15 (4bit)
100+27=127(7bit)
100+255=255(8bit)
其实做这个转换主要就是先弄出高位0的个数,
取反后再把这些位清0就是了
 
to stlont :
用 not 是不行的,10反会得65525。。。因为word是16位的,这种方法不会忽略高位上的0。。。。

to tswhq :
我要的效果的确如stlont所说,取反时,将高位上的0丢掉。比如: 10的二进制如果写成8位为00001010, 但我只取低四位,则为1010,求反后为0101,即为十进制的5。

谢谢两位!
 
只要低四位:
i:=10;
asm
not i;
end
i:=i and &H000f (Vb???)
 
仔细看我的回答,特别是最后2句,
我提供的只是方法思路,
具体工作当然还要自己做,
not可以用,and自然也可以用,
高位屏蔽操作就是最后一步,
另外提醒你一下,用自定义子类型,
可以定义一个0..15的类型来用,
如果你一直只要4位,那就正好
 
理论上自定义子类型是个办法,
但现实中用户可能输入4位的、5位数的,也可能是10位,20位的,
这样几乎是不可能实现的。。。

算了,我用自已的土办法吧。。。
 
后退
顶部