質問
私はこれらの可能なビットフラグを持っています。
1, 2, 4, 8, 16, 64, 128, 256, 512, 2048, 4096, 16384, 32768, 65536
したがって、各数字は、サーバー側の真/偽のステートメントのようなものです。したがって、最初の3つのアイテムと、サーバー側で最初の3つのアイテムのみが「True」とマークされている場合、Webサービスは7を返します。これらすべての数値の合計であるWebサービス。
どのアイテムが「真」とマークされているかを見つけるために戻ってきた数を処理する最良の方法は何ですか?
解決
if (7 & 1) { // if bit 1 is set in returned number (7)
}
他のヒント
少しマスキングオペレーターを使用してください。 C言語で:
X & 8
「8」のビットが設定されている場合、本当です。
ビットマスクを列挙して、設定されている数を数えることができます。
単語全体にビットが含まれている場合があり、単純に設定されているビット数を単純に計算したい場合は、本質的に「人口数」が必要です。人口数を得るための絶対的な最速の方法は、通常、マシンの命令セットで利用可能なネイティブ「POPCNT」を実行することです。
スペースを気にしない場合は、配列をセットアップできます カウントビット[... 事前に計算されたビットカウントであなたの価値によってインデックス付けされています。次に、単一のメモリアクセスがビットカウントを計算します。
よく使用されるのは単なるものです 「ビットトゥイッドコード」 それはビットカウントを計算します:
(カルニガンの方法):
unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v
for (c = 0; v; c++)
{
v &= v - 1; // clear the least significant bit set
}
(平行ビットサミング、32ビット)
v = v - ((v >> 1) & 0x55555555); // reuse input as temporary
v = (v & 0x33333333) + ((v >> 2) & 0x33333333); // temp
c = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; // count
ビットツイッドリングハックを以前に見たことがない場合は、おやつを求めています。
PHPは、面白いことに、この算術のいくつかで面白いことをするかもしれません。
質問は古いと思った。私は数字をバイナリで理解するのが明確にしています。コードはテストされていませんでしたが、ロジックが明確であることを願っています。コードはPHP固有です。
define('FLAG_A', 0b10000000000000);
define('FLAG_B', 0b01000000000000);
define('FLAG_C', 0b00100000000000);
define('FLAG_D', 0b00010000000000);
define('FLAG_E', 0b00001000000000);
define('FLAG_F', 0b00000100000000);
define('FLAG_G', 0b00000010000000);
define('FLAG_H', 0b00000001000000);
define('FLAG_I', 0b00000000100000);
define('FLAG_J', 0b00000000010000);
define('FLAG_K', 0b00000000001000);
define('FLAG_L', 0b00000000000100);
define('FLAG_M', 0b00000000000010);
define('FLAG_N', 0b00000000000001);
function isFlagSet($Flag,$Setting,$All=false){
$setFlags = $Flag & $Setting;
if($setFlags and !$All) // at least one of the flags passed is set
return true;
else if($All and ($setFlags == $Flag)) // to check that all flags are set
return true;
else
return false;
}
使用法:
if(isFlagSet(FLAG_A,someSettingsVariable)) // eg: someSettingsVariable = 0b01100000000010
if(isFlagSet(FLAG_A | FLAG_F | FLAG_L,someSettingsVariable)) // to check if atleast one flag is set
if(isFlagSet(FLAG_A | FLAG_J | FLAG_M | FLAG_D,someSettingsVariable, TRUE)) // to check if all flags are set
1つの方法は、数字をループして、左シフト(つまり、2で除算)を左にし、最初のビットを1つのオペランドを使用して比較することです。
PHPコードには明確な答えがないため、この作業例を追加します。
// returns array of numbers, so for 7 returns array(1,2,4), etc..
function get_bits($decimal) {
$scan = 1;
$result = array();
while ($decimal >= $scan){
if ($decimal & $scan) $result[] = $scan;
$scan<<=1;
}
return $result;
}