我需要编写一个获取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
如果我逐位循环字节但是我需要更快的位操作方法,那么实现是非常有用的。 有什么建议?我有点丢失,因为在考虑不同的长度时,位操作应该忽略位于长度之后的位
答案 0 :(得分:2)
您可以使用按位运算符同时检查多个位。例如,如果要检查a
的所有设置位是否具有b
的相应设置位,则可以编写以下内容:
(~b & a & mask) == 0
此处~b
是b
的逐位反转,1
位于b
0
的所有位置都有~b & a
个,1
当且仅当a
在此职位中1
且b
具有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;