【发布时间】:2014-01-26 09:05:29
【问题描述】:
正如 David 在对答案 here 的评论中已经问过的那样,我对这个函数的工作原理非常感兴趣,因为如果将结果长度从 32 更改为 16,我似乎无法获得相同(正确)的值或 8.
我用过函数
function IntToBin(Value: LongWord): string;
var
i: Integer;
begin
SetLength(Result, 32);
for i := 1 to 32 do begin
if ((Value shl (i-1)) shr 31) = 0 then begin
Result[i] := '0'
end else begin
Result[i] := '1';
end;
end;
end;
不知何故工作得很好。 (1 作为 000....001 返回,2 作为 000....010 返回,3 作为 000...011,等等......)。
但是,由于我只需要 8 个字符的长字符串结果,我将函数中的数字更改为 8 来得到这个:
function IntToBin(Value: LongWord): string;
var
i: Integer;
begin
SetLength(Result, 8);
for i := 1 to 8 do begin
if ((Value shl (i-1)) shr 7) = 0 then begin
Result[i] := '0'
end else begin
Result[i] := '1';
end;
end;
end;
但我得到的结果如下:
1: 00000001
2: 00000011
3: 00000011
4: 00000111
5: 00000111
6: 00000111
7: 00000111
8: 00001111
9: 00001111
10: 00001111
11: 00001111
12: 00001111
16 和 8 差不多。
也尝试将 LongWord 更改为 Integer 和 Byte,但得到了相同的结果。
所以......嗯......我在这里错过了什么,不明白? :/
PS:出于学习目的而询问,在第一个函数的末尾用 Copy(Result, 25, 8) 解决了我的情况,因为需要传递 8 个字符长的字符串,但我真的很想了解发生了什么... :)
谢谢
【问题讨论】:
标签: delphi delphi-xe3