9

私はこれらの可能なビットフラグを持っています。

1, 2, 4, 8, 16, 64, 128, 256, 512, 2048, 4096, 16384, 32768, 65536

したがって、各数値はサーバー側のtrue/falseステートメントのようなものです。したがって、サーバー側で最初の3つの項目のみが「真」とマークされている場合、Webサービスは7を返します。または、上記の14の項目すべてが真である場合でも、これらすべての数値の合計であるWebサービス。

「真」とマークされているアイテムを見つけるために戻ってきた番号を処理するための最良の方法は何ですか?

4

5 に答える 5

7

ビットマスキング演算子を使用します。C言語の場合:

 X & 8

「8」ビットが設定されている場合はtrueです。

ビットマスクを列挙し、設定されている数を数えることができます。

単語全体にビットが含まれている場合で、設定されているビット数を単純に計算したい場合は、本質的に「人口カウント」が必要です。人口数を取得するための絶対的な最速の方法は、マシンの命令セットで通常利用可能なネイティブの「popcnt」を実行することです。

スペースを気にしない場合は、事前に計算されたビット数を使用して、値でインデックス付けされた配列countedbits[...]を設定できます。次に、1回のメモリアクセスでビット数が計算されます。

多くの場合 、ビット数を計算する単なる「ビット調整コード」が使用されます。

(カーニガンの方法):

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は面白いので、この算術のいくつかで面白いことをするかもしれません。

于 2010-05-07T21:58:17.723 に答える
6
if (7 & 1) { // if bit 1 is set in returned number (7)

}
于 2010-05-07T22:00:36.610 に答える
5

質問が古いと思ったので、他の誰かを助けるかもしれません。わかりやすくするために、数値を2進数で示しています。コードはテストされていませんが、ロジックが明確であることを願っています。コードは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
于 2015-05-21T07:54:10.620 に答える
1

1つの方法は、数値をループして左シフトし(つまり、2で除算)、&オペランドを使用して最初のビットを1と比較することです。

于 2010-05-07T22:05:26.457 に答える
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;
}
于 2016-09-15T18:59:51.030 に答える