长度为

时间:2016-12-15 08:39:55

标签: c++ bit-manipulation

我需要编写一个获取2个字节和布尔值的函数:

filter(int length, uint16_t* A, uint16_t* B, bool checkByZeros)

所需的逻辑是: length是要检查的的数量(即如果length = 9,则字节数组将包含2个字节) 如果checkByZeros是False

该函数将返回true if:

all the bytes set (=1) in A are also set in B
示例中的

(长度= 9):

checkByZeros=True, A:000001111, B:000001111 ==> True
checkByZeros=True, A:000001111, B:000011111 ==> True
checkByZeros=True, A:000001111, B:000000111 ==> False

如果checkByZeros是False

如果出现以下情况,该函数将返回true: A中所有未设置的字节(= 0)也未在B中设置 例如:

checkByZeros=False, A:000001111, B:000001111 ==> True
checkByZeros=False, A:000001111, B:000011111 ==> False
checkByZeros=False, A:000001111, B:000000111 ==> True

如果我逐位循环字节但是我需要更快的位操作方法,那么实现是非常有用的。 有什么建议?我有点丢失,因为在考虑不同的长度时,位操作应该忽略位于长度之后的位

2 个答案:

答案 0 :(得分:2)

您可以使用按位运算符同时检查多个位。例如,如果要检查a的所有设置位是否具有b的相应设置位,则可以编写以下内容:

(~b & a & mask) == 0

此处~bb的逐位反转,1位于b 0的所有位置都有~b & a个,1当且仅当a在此职位中1b具有0时才会(1 << length) - 1处于某个位置,这正是我们所需要的。

掩码为1,即仅在length最低位包含long long,因此有助于我们忽略结果的最高位,我们并不想要检查。

此方法允许您一次检查最多64位(checkByZeros的长度)。如果true <configuration> <log4net> <appender name="RR.Db" type="log4net.Appender.SitecoreLogFileAppender, Sitecore.Logging"> <file value="$(dataFolder)/logs/RR.Db.{date}.txt" /> <appendToFile value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%4t %d{ABSOLUTE} %-5p %m%n" /> </layout> <encoding value="utf-8" /> </appender> <logger name="RR.Db" additivity="false"> <level value="INFO"/> <appender-ref ref="RR.Db"/> </logger> .... </log4net> </configuration> ,您可以编写类似的代码。

答案 1 :(得分:0)

uint16_t temp;

if(checkByZeroes)
{
    temp = *B | *A; // ignore 0's in B which are not in a
}
else
{
    temp = *B & *A; // ignore 1's in B which are not in a
}

return temp == *A;