C 优化按位运算

C 优化按位运算,c,bit-manipulation,C,Bit Manipulation,我有一个无符号整数,其中a,b,c,d表示从msb到lsb的位。我想得到以下数字 x1 = ab0cd x2 = ab1cd 在C中使用位运算最快的方法是什么 我现在正在尝试的是 unsigned int blockid1 = N>>offset; unsigned int key1 = (blockid<<(1+offset))|(((1<<offset)-1)&N); unsigned int key2 = (key1)|(1<<of

我有一个无符号整数,其中
a
b
c
d
表示从
msb
lsb
的位。我想得到以下数字

x1 = ab0cd
x2 = ab1cd
在C中使用位运算最快的方法是什么

我现在正在尝试的是

unsigned int blockid1 = N>>offset;
unsigned int key1 = (blockid<<(1+offset))|(((1<<offset)-1)&N);
unsigned int key2 = (key1)|(1<<offset);
无符号整数块ID1=N>>偏移量;

unsigned int key1=(blockid由于您的输入只有4位宽,这意味着总共只有16个输出,因此我建议至少测试(即实现和分析)一个查找表

如今,有了超快的ALU和慢速(ish)内存,查找速度通常不会更快,但它始终值得测试。一个小表意味着它不会对缓存造成太大污染,这可能会使它比一系列算术指令更快

由于您的输出也非常小,因此完整的表可以表示为:

const static uint8_t keys[16][2];

32字节非常小,如果您经常这样做(即在紧循环中一行多次),表应该完全适合缓存。

因为您的输入只有4位宽,这意味着总共只有16个输出,我建议至少测试(即实现和分析)一个查找表

如今,有了超快的ALU和慢速(ish)内存,查找速度通常不会更快,但它始终值得测试。一个小表意味着它不会对缓存造成太大污染,这可能会使它比一系列算术指令更快

由于您的输出也非常小,因此完整的表可以表示为:

const static uint8_t keys[16][2];

32字节非常小,如果您经常这样做(即在紧循环中一行多次),表应该完全适合缓存。

您应该看看Jasper Neumann关于位置换的页面。它包括一个在线代码生成器。但是对于您的特定情况,它可能非常复杂(如果我们认为0或1是MSB),一比特的置换。


注:我让你谷歌AdRESE,因为它没有域名,直接IPS是不允许的。所以,

< P>你应该看看Jasper Neumann关于比特排列的页面。它包括一个在线代码生成器。但是对于你的特定情况来说,它可能是有用的复杂的(如果我们认为0或1是MSB的话,一个比特的排列)。

const unsigned int mask = (~0) << offset;  // same as -(2**offset)
unsigned int key1 = N + (N & mask);
unsigned int key2 = key1 - mask;

注意:我允许你用谷歌搜索地址,因为它没有域名,所以SO不允许直接IP。

const unsigned int mask=(~0)
const unsigned int mask=(~0)我猜按位操作都是常数时间操作,所以我不知道什么会被认为是快速按位操作。如果你的方法有效,我不知道会有任何更快的方法来做这些事情。无论如何,在大多数情况下,这些操作都会映射到CPU指令/偏移量总是2吗?,位置总是在第三位??不!偏移量可以是0-30之间的任何值。我猜按位操作都是常数时间操作,所以我不知道什么可以作为快速按位操作。如果你的方法有效,我不知道会有任何更快的方法来做这类事情。无论如何,在大多数情况下,这些操作都会映射到CPU指令/偏移量总是2吗?位置总是在第3位吗?不!偏移量可以是0-304位之间的任何值。数字是常规32位宽4位只是举例。数字是常规32位宽我的站点关于位排列和其他内容总是可以通过访问,但被重定向到具有半静态ip地址。自2012年10月1日起,该地址托管在“真实”web空间。Jasper Neumanny关于位置换和其他内容的网站始终可以通过访问,但被重定向到具有半静态ip地址的专用服务器。自2012年10月1日起,该地址托管在“真实”web空间。Jasper Neumann
const unsigned int mask = (~0) << offset;  // same as -(2**offset)
unsigned int key1 = N + (N & mask);
unsigned int key2 = key1 - mask;