是否有任何简单的方法可以水平翻转位掩码,一个oneliner? 它应该执行以下操作:
0b1010101111001101 -> 0b1011001111010101
直接的解决方案就是一点一点地做到这一点:
uint16 flipUint16Horizontally(uint16 bitmask)
{
uint16 flippedMask = 0;
for(unsigned int bit = 0; bit < 16; ++bit)
{
uint16 currentBit = (bitmask & (1 << bit)) >> bit;
flippedMask |= currentBit << (15 - bit);
}
return flippedMask;
}
有更优雅的方式吗?
答案 0 :(得分:0)
鉴于你有一个@Test
public void test_reportRoute_NoResultsFound_EmailSent() throws Exception {
List<AuditLog> bodyList = new ArrayList<>();
context.getRouteDefinition("monthly-report-route").adviceWith(context,
new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
replaceFromWith(TEST);
weaveById("updateProcControl").replace()
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader("CamelMyBatisResult", 1);
}
});
weaveById("selectReport").replace()
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setBody(bodyList);
}
});
weaveById("RecipientList_reportEmail").replace()
.to("smtp://localhost:8083"
+"?to=" + "test@test.com"
+"&from=" + "test1@test1.com");
}
});
ProducerTemplate prod = context.createProducerTemplate();
prod.send(TEST, exch);
assertThat(exch.getIn().getHeader("CamelMyBatisResult"), is(1));
assertThat(exch.getIn().getBody(), is(""));
}
,一个查找表。这反过来是一个班轮,当然初始化需要更多的工作。它不一定是最快的方式,因为它是一个非常大的表,你可能会相对随机地索引它,这可能导致缓存未命中。同样仍然很简单,并且需要更少的空间:一个可以反转字节的查找表。以明显的方式使用它:
uint16
当然,你仍然需要处理初始化,但速度不那么重要。
有一个(在我看来)更优雅,但有点复杂的方式只使用一些按位操作(并没有完全难以理解的余数操作或类似的东西),反转第一个相邻位,然后相邻的2位片,然后相邻的半字节,等等每一步加倍反转的东西的宽度,直到最后所有的位都被颠倒过来&#34;全局&#34;。顺便说一下,您可以对这些步骤进行重新排序,并且有一种方法可以使用少一个操作来编写它们,但也可以减少ILP。
return (bitreverse[x & 0xFF] << 8) | bitreverse[x >> 8];