水平翻转位掩码

时间:2016-11-17 10:41:23

标签: c bit-manipulation

是否有任何简单的方法可以水平翻转位掩码,一个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;
}

有更优雅的方式吗?

1 个答案:

答案 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];