嘗試將一個整數轉換為32個布爾運算的打包記錄。
TUserRightsRecord = packed record
r1:布林值。
.
.
end;
然而,我無法找到一個將變數轉換為打包記錄的函式,因為直接賦值不起作用。
- 什么函式可以將一個變數(或至少是Integer)轉換為相同大小的打包記錄?
uj5u.com熱心網友回復:
嘗試將一個整數轉換為32個布爾運算的打包記錄。
請注意,SizeOf(Integer) = 4而SizeOf(<packed record of 32 booleans>) = 32因為SizeOf(Boolean) = 1(1位元組=8位元)。你似乎認為Boolean是一個單一的位;它不是的。
然而,如果是這樣的話,你可以簡單地將整數投到這樣一個記錄中。
(當然,寫一個函式將一個整數 "轉換 "為32個布爾運算的記錄也是很容易的。
使用整數中的位的標準方法是使用位運算子:
const
HasScreen = 1;
HasSound = 2;
HasKeyboard = 4;
HasMouse = 8;
HasInternet = 16;
var
ComputerProperties: 整數。
begin
//測驗一下
if ComputerProperties and HasInternet = 0 then
ShowMessage('You need an Internet connection.')。
//設定一個位。
Computer := Computer or HasInternet;
// Clear a bit
Computer := Computer and not HasInternet;
在Delphi中,使用sets是比較習慣的做法:
type
TComputerFeature = (cfScreen, cfSound, cfKeyboard, cfMouse, cfInternet)。
TComputerFeatures = set of TComputerFeature;
var
特點。TComputerFeatures;
begin
Features := [cfScreen, cfKeyboard];
if not (cfInternet in Features) then
ShowMessage('你需要一個互聯網連接。')。
Include(Features, cfInternet);
Exclude(Features, cfInternet)。
end。
然而,你可以使用高級記錄輕松地模擬你的原始設計方法:
type
TBit32 = type Integer;
TBit32Helper = record helper for TBit32
strict private
function GetBit(Index: Integer): Boolean;
procedure SetBit(Index: Integer; const Value。Boolean);
public
property Bit[Index: Integer]。Boolean read GetBit write SetBit;
end;
function TBit32Helper. GetBit(Index: Integer): Boolean;
begin
結果 :=(自我 shr Index) and 1 <> 0;
end;
procedure TBit32Helper. SetBit(Index: Integer; const Value: Boolean);
begin
ifValue then
Self := Self or (1 shl Index)
else[/span
Self := Self and not (1 shl Index) 。
end;
begin;
var x: Integer := 123;
Writeeln(TBit32(x).Bit[4]); // read
TBit32(x).Bit[6] := False; //write。
uj5u.com熱心網友回復:
用longbool替換boolean可能就夠了
program Project1。
us
System.SysUtils;
var
i:整數。
begin
try 試試
i := Sizeof(boolean);
writeln('Sizeof(boolean): ', i);
i := Sizeof(LongBool);
writeln('Sizeof(LongBool): ', i);
readln(i);
except
on E: 例外 do
Writeln(E.ClassName, ': '/span>, E.Message)。
end。
end。
否則,你可能不得不將自己的資料型別定義為記錄。這里你必須注意你的資料型別的記憶體大小 "SizeOf"。這里有一個例子:
program Project1。
{$APPTYPE CONSOLE}
{$R *.res}
us
System.SysUtils;
type
TConvert=packed record
public
function ToString: string。
public
/Redefined memory。每個欄位有相同的起始地址。
case integer of
0: (b: 布林值)。
1: (G: LongBool)。
2: (i: integer);
3: (data: array[0...3]of byte)。)
end。
function TConvert.ToString: string。
begin; begin.
/Low is left !!!
結果 := Format('[%.2x|%.2x|%.2x|%. 2x]', [data[0], data[1], data[2], data[3] ]。
end;
var
i: 整數。
r: TConvert。
begin
try
i := Sizeof(TConvert);
writeln('Sizeof(TConvert): ', i);
r.b := True。
writeln('boollean(true): ', r.ToString, ' ',BoolToStr(r.G, true))。
r.G := false;
writeln('LongBool(false): ', r.ToString, ' ',BoolToStr(r.G, true))。
r.G := True。
writeln('LongBool(true): ', r.ToString, ' ', BoolToStr(r.G, true))。
r.i := 1;
writeln('LongBool(i=1): ', r.ToString, ' ', BoolToStr(r.G, true))。
readln(i);
except except
on E: 例外 do
Writeln(E.ClassName, ': '/span>, E.Message)。
end。
end。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316495.html
標籤:
上一篇:巧妙地縮放影像,無需外部庫
下一篇:錯誤:沒有選擇訪問查看的權限
