如何获得一个整数的二进制最高位(50分)

  • 主题发起人 主题发起人 埋名
  • 开始时间 开始时间

埋名

Unregistered / Unconfirmed
GUEST, unregistred user!
例如:十进制8对应的二进制为00001100,则其二进制最高位为00001000
 
什么意思
 
再例如:7的二进制为00000111,则其二进制最高位为00000100
 
自己写函数,先转换成二进制,再取最高位就容易了
 
procedure TForm1.Button1Click(Sender: TObject);
Function DecToBin(value :integer): string;
//将一整数化为二进制数
var temp1, temp2 : integer;
begin
Result := '';
repeat
temp1 := (Value Div 2);
temp2 := (Value Mod 2);
Value := temp1;
Result := inttostr(temp2) + Result;
until temp1 < 2;
if temp1 <> 0 then
Result := inttostr(temp1) + Result;
end;
Function GetHighBitLikeYourSample:string;
var i : integer;
begin
Result := copy(DecToBin(strtoint(Edit1.Text)),1,1);
for i := 1 to length(DecToBin(strtoint(Edit1.Text)))-1do
Result := Result + '0';
end;
begin
try
Showmessage('十进制整数转二进制:'+Edit1.Text +'--->' + DecToBin(strtoint(Edit1.Text))+#13
+ '你示例形式的高位:' + GetHighBitLikeYourSample);
except
Showmessage('参数有误!');
end;
end;
 
很有意思,用在什么方面的呢。
我觉得使用1、2、4、8、16、32...2^X等的逻辑来算会更好些,
思路如下:
一、锁定二进制长度,视你要处理的数据而定,尽量足够大;
二、若为0,视你自己认为咯,为1或0;
三、采用二分法选择要除的数(可作2^X来算),商若小于0则在其下啦继续用二分法选择除数;商若大于0则:若小于2(就是等于1)则就为该级了,反之在其上继续用二分法确定除数。
四、确定了其级数,结果也就确定了。'1'+ X- 1个0,格式可自己确定啦。
五、以上方法在处理其他更高进制会更快,如16进制。
例如:十进制100---- 确定二进制位数为16位,二分法确定先X=8;除以256为商为0,继续二分法X=4>0,除以16商为5>0,继续二分法X= 6,除以32商为3>0,继续二分法X= 7,除以64商为1,结束。X=7:'1'+'000000'
欢迎大家评点。
呵呵~~~~~~~~~~~~~~~~
 
用对数计算最方便了,呵呵 :P
function High2Int(n:Integer):Integer;
begin
Result:=Trunc(Ln(n)/Ln(2));
end;

function High2Str(n:Integer):String;
var
i:Integer;
begin
i:=Trunc(Ln(n)/Ln(2));
SetLength(Result,i);
FillChar(Result[2],i-1,'0');
Result[1]:='1';
end;
 
谢谢大家,问题解决了。
 
后退
顶部