我有一个无符号整数N = abcd
,其中a
,b
,c
,d
表示从msb
到{{1}的位}。我想得到以下数字
lsb
在C中使用按位运算的最快方法是什么?
我现在正在尝试的内容如下
x1 = ab0cd
x2 = ab1cd
此处偏移是我要插入unsigned int blockid1 = N>>offset;
unsigned int key1 = (blockid<<(1+offset))|(((1<<offset)-1)&N);
unsigned int key2 = (key1)|(1<<offset);
和0
的位置。
答案 0 :(得分:1)
const unsigned int mask = (~0) << offset; // same as -(2**offset)
unsigned int key1 = N + (N & mask);
unsigned int key2 = key1 - mask;
答案 1 :(得分:0)
由于您的输入只有4位宽,这意味着总共只有16位输出,我建议至少测试(即实现和分析)查找表。
现在,凭借超快的ALU和慢速(ish)内存,查找通常不会更快,但总是值得测试。一个小表意味着它不会非常污染缓存,这可能使它比一系列算术指令更快。
由于您的输出也非常小,因此完整的表格可以表示为:
const static uint8_t keys[16][2];
32个字节非常小,如果经常这样做(即在紧密循环中连续多次),该表应该完全适合缓存。
答案 2 :(得分:0)
你应该看看Jasper Neumann关于位置换的页面。它包括一个在线代码生成器。但是,对于您的特定情况,它可能会非常复杂(如果我们将0或1视为MSB,则排列一位)。
注意:我允许你谷歌这个地址,因为它没有域名,SO不允许直接IP。