正如大衛在回答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
有點相同,而不是8個。
試圖將LongWord更改爲Integer和Byte,但得到了相同的結果。
所以......嗯......我在這裏錯過了什麼,不明白? :/
PS:爲了學習的目的,在第一個函數結束時使用Copy(Result,25,8)解決了我的情況,因爲需要8個字符長的字符串通過,但我真的想知道發生了什麼... :)
感謝
+1出於好奇 – MartynA