2013-01-23 51 views
4

我是高中的學生,我目前在Delphi XE3中學習。我們正在學習BIT操作。我們有一個任務,雖然我已經閱讀了很多關於此主題的內容,並瞭解了將信息存儲在Bits和SHL/SHR中的整個過程,但我很難理解如何在Delphi中執行此過程。位操作在XML中的Delphi - 按位

的分配如下:

Decimal  Hexidecimal Binary 
1    0x0001   0000000000000001 
2    0x0002   0000000000000010 
4    0x0004   0000000000000100 

在XML文件傳遞一個整數值來標識設置的選項。例如。如果我想發送選項1和選項2,我會添加1 + 2 = 3。我會發送3作爲數字,以指定選項1和2爲真。

在客戶端的二進制值將是0000000000000011 = 3

從我讀過,我需要使用口罩,但我不知道如何做到這一點。如何在Delphi中使用蒙版來獲取單個的值爲True或False。

我試着在一個常規的Integer變量中這樣做,但它總是被視爲一個整數,結果很奇怪。如果我將整數轉換爲二進制字符串表示形式,並且迭代字符的結果是正確的,但我假設我不應該用字符串來完成此操作。任何幫助或例子將不勝感激。謝謝。

+0

請你可以問一個具體的問題。這裏沒有一個。 –

+0

我想了解如何從一個整數值中設置特定的位,以及如何設置一個特定的位。如果值爲1 + 4 = 5,那麼如果右側的1和3位設置爲或等於True,我該如何讀取。 – LHearn

+0

好吧,我們通常從0開始計數位。所以你應該測試0和2位。爲此,你寫0位的((x和1)<> 0),'(x和4)<> 0「代表第二位。你應該直接提出這個問題。 –

回答

3

你平時檢查特定位被使用and二進制運算符一個整型變量設置,並設置使用or運營商各個位,如下所示:

const 
    OPTION_X = $01; 
    OPTION_Y = $02; 
    OPTION_Z = $04; 

var 
    Options: Byte; 
begin 
    Options := OPTION_X or OPTION_Y; //actually 3, like in your example 
    //check if option_X is set 
    if (Options and OPTION_X) = OPTION_X then 
    ShowMessage('Option X is set'); //this message is shown, because the bit is set 
    //check if option_Z is set 
    if (Options and OPTION_Z) = OPTION_Z then 
    ShowMessage('Option Z is set'); //this message is NOT shown 
end; 

不同OPTION_常數,實際上在某種意義上它們被用來掩蔽比特爲零(以檢查是否設置了特定比特)或將比特掩碼設置爲1(以設置特定比特)。

考慮一下這個片段:的01010000

begin 
    .. 

    if cbOptionX.Checked then 
    Options := Options or OPTION_X; 
    .. 

or將第一位掩碼爲1。如果我們有一個選項值開始(二進制),所產生的選項將是01010001

01010000 
OR 00000001 //OPTION_X 
    = 01010001 

使用相同的值將所有其他位置爲0以檢查是否設置了特定的位。該if條件,例如:(Options and OPTION_Z) = OPTION_Z,做到這一點:

  • 首先它掩蓋所有選項變量爲0。如果我們考慮的01010001的最後一個值,該操作將導致清算的不感興趣字節所有的位,但第一個。

    01010001 
    AND 00000001 
        = 00000001 
    

考慮到01010000起始值它將返回零:

 01010000 
    AND 00000001 
     = 00000000 
  • 接下來,如果該值等於面具本身進行比較。如果相等,則該位在原始選項變量中設置,否則未設置。如果你的掩碼只包含一個比特,這就是味道的問題,你可以檢查結果值是否是例如不同於0,但是如果你的掩碼包含多個比特,並且你想檢查是否所有的比特都被設置了,你必須檢查平等。
+1

雖然所有答案都有幫助,UWA Rabee給出了最簡單的答案,但我需要理解口罩的概念。 @jachguate,非常感謝。比我想象的要簡單得多。 – LHearn

+0

更好地測試<> 0,所以避免違反DRY –

+0

@David,你讀過答案的最後一段嗎? – jachguate

1

德爾福有位運算符用於操縱整數類型的各個位。查看shl,shr,and,orxor運營商。要合併比特,請使用or運算符。要測試位,請使用and運算符。例如,假定這些常數:

const 
    Option1 = 0x0001; 
    Option2 = 0x0002; 
    Option3 = 0x0004; 

or操作者查看兩個輸入值的位,併產生具有在一個地方位1其中任一輸入值具有1比特的輸出值。因此,結合位應該是這樣的:

var 
    Value: Integer; 
begin 
    Value := Option1 or Option2; 
    { 
    00000000000000000000000000000001 Option1 
    00000000000000000000000000000010 Option2 
    -------------------------------- OR 
    00000000000000000000000000000011 Result 
    } 
    ... 
end; 

and運營商着眼於兩個輸入值的位,產生具有僅在兩個輸入值有1位地方1位的輸出值,否則反而會產生0位。因此測試位如下所示:

var 
    Value: Integer; 
    Option1Set: Boolean; 
    Option2Set: Boolean; 
    Option3Set: Boolean; 
begin 
    Value := 7; // Option1 or Option2 or Option3 

    Option1Set := (Value and Option1) = Option1; 
    { 
    00000000000000000000000000000111 Value 
    00000000000000000000000000000001 Option1 
    -------------------------------- AND 
    00000000000000000000000000000001 Result 
    } 

    Option2Set := (Value and Option2) = Option2; 
    { 
    00000000000000000000000000000111 Value 
    00000000000000000000000000000010 Option2 
    -------------------------------- AND 
    00000000000000000000000000000010 Result 
    } 

    Option3Set := (Value and Option3) = Option3; 
    { 
    00000000000000000000000000000111 Value 
    00000000000000000000000000000100 Option3 
    -------------------------------- AND 
    00000000000000000000000000000100 Result 
    } 
    ... 
end; 
2

Delphi有一個預定義的類型TIntegerSet,它允許使用集合運算符。假設options是一個整數,您可以檢查是否有任何位(從0開始)設置是這樣的:

option1 := 0 in TIntegerSet(options); { Bit 0 is set? } 
option3 := 2 in TIntegerSet(options); { Bit 2 is set? } 

更改選項通過完成包含或排除:

Include(TIntegerSet(options), 0); { set bit 0 } 
Exclude(TIntegerSet(options), 2); { reset bit 2 } 

當然你可以使用任何其他可能有幫助的集合運算符。