我有这些可能的位标志。
1, 2, 4, 8, 16, 64, 128, 256, 512, 2048, 4096, 16384, 32768, 65536
因此每个数字都像服务器端的true / false语句。因此,如果前3个项目,并且只有前3个项目在服务器端标记为“true”,则Web服务将返回7.或者,如果以上所有14个项目都为真,我仍然会从网络服务是所有这些数字的总和。
处理我回来找出哪些项目被标记为“真实”的最佳方式是什么?
答案 0 :(得分:7)
if (7 & 1) { // if bit 1 is set in returned number (7)
}
答案 1 :(得分:6)
使用位掩码运算符。在C语言中:
X & 8
如果设置了“8”位,则为真。
您可以枚举位掩码,并计算设置的位数。
如果确实存在整个单词包含位,并且您想要简单的话 计算设置了多少位,你本质上想要“人口数”。绝对的 获得人口数量的最快方法是通常执行本地“popcnt” 可在机器的指令集中找到。
如果您不关心空间,可以设置一个数组 countingbits [...] ,并使用预先计算的位数设置您的值。然后单个内存访问计算您的位数。
经常使用的只是普通的"bit twiddling code"来计算位数:
(Kernigan的方法):
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很有趣,可能会用这个算法做一些有趣的事情。
答案 2 :(得分:5)
认为问题是旧的可能会帮助别人。我把数字放在二进制文件中更清楚地理解。代码尚未经过测试,但希望逻辑清晰。代码是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
答案 3 :(得分:1)
一种方法是循环你的数字,左移(即除以2)并使用&和第一位与1进行比较。操作数。
答案 4 :(得分: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;
}