C++ C语言中的位运算符
我已经写了一个交换位位置(源位和目标位)的代码。。它运转良好。。但是有没有优化的代码来实现这一点C++ C语言中的位运算符,c++,c,gcc,bit-manipulation,bitwise-operators,C++,C,Gcc,Bit Manipulation,Bitwise Operators,我已经写了一个交换位位置(源位和目标位)的代码。。它运转良好。。但是有没有优化的代码来实现这一点 int bit_swap(int num, int sbit, int dbit) { if(num & (1 << sbit) == num & (1 << dbit)) return num; else return (num ^ ((1 << sbit) | (1 << dbit))); } int位交换(int num、int
int bit_swap(int num, int sbit, int dbit)
{
if(num & (1 << sbit) == num & (1 << dbit))
return num;
else
return (num ^ ((1 << sbit) | (1 << dbit)));
}
int位交换(int num、int sbit、int dbit)
{
如果(num&(1你犯了一个经典错误,认为C语言中的行数越少意味着代码越优化
您应该真正检查汇编程序的输出并分析代码,看看它是否是一个实际的瓶颈
我倾向于首先对可读性进行优化,然后在出现问题时才攻击性能。因此,一个更具可读性的解决方案(在我看来不是那么简单)应该是:
unsigned int bit_swap (unsigned int num, unsigned int pos1, unsigned int pos2) {
// Swapping identical bit positions is a no-op.
if (pos1 == pos2)
return num;
// Get masks from bit positions.
unsigned int mask1 = 1 << pos1;
unsigned int mask2 = 1 << pos2;
// Get bit truth values.
int bit1_was_set = ((num & mask1) != 0);
int bit2_was_set = ((num & mask2) != 0);
// Clear and set first bit (set only if second bit was originally set).
num = num & ~mask1;
if (bit2_was_set)
num = num | mask1;
// Do the same for other bit.
num = num & ~mask2;
if (bit1_was_set)
num = num | mask2;
// Return the value with swapped bits.
return num;
}
unsigned int bit_交换(unsigned int num、unsigned int pos1、unsigned int pos2){
//交换相同的位位置是不可操作的。
if(pos1==pos2)
返回num;
//从位位置获取遮罩。
无符号整数mask1=1无条件版本
int bit_swap(int num, int sbit, int dbit)
{
int sval = !!(num & (1 << sbit)); // sets to 1 iff the s-bit is already set
int dval = !!(num & (1 << dbit)); // sets to 1 iff the d-bit is already set
int xorval = (sval ^ dval); // sets to 1 if (sval != dval), otherwise 0
// so if xorval is 1, then it will toggle the bits at the S and D positions
// otherwise, the expression below evalutes to "num" that was passed in
return (num ^ ((xorval << sbit) | (xorval << dbit)));
}
int位交换(int num、int sbit、int dbit)
{
int sval=!!(num&(1我想到了
unsigned swapBits(unsigned num, int sbit, int dbit)
{
return ( num & // All bits
~((1<<sbit) | (1<<dbit))) // Except sbit and dbit
| (((num>>sbit)&1)<<dbit) // but with sbit moved to dbit
| (((num>>dbit)&1)<<sbit); // and with dbit moved to sbit
}
unsigned交换位(unsigned num、int-sbit、int-dbit)
{
返回(num&//所有位
~((1你分析过吗?你分析过没有if
的情况吗?@leppie:这篇文章太好了..帮了我很多..非常感谢!)对于交换操作,两个位都是源位和目标位,因此将一个位命名为源位,另一个位命名为目标位是有误导性的。最好将它们命名为pos1
和pos2
或类似名称,如某些答案所示。此外,在处理单个位时使用无符号整数通常是一个好主意,至少如果您愿意的话你的代码是可移植的。但这取决于你需要它做什么,只是要注意,你可能会遇到负值的问题。我建议从提高警告级别开始,铿锵报告:&的优先级低于==;==将首先在if(num&(1)在典型的C实现中,如果sbit
或dbit
指示int
中的最高位,则此代码具有未定义的行为,因为1未定义只有在(sbit<0)| |(sbit>=(sizeof(int)*8)时才会出现问题。(对于dbit也是如此)。假设32位,31是MSB索引。(1)有趣。我刚看了你引用的规范。我知道有符号负整数右移的未定义行为,但不知道左移行为。然而,我怀疑如果(1认为机器以某种方式工作是一个陷阱,因此C语义随之产生。发生的一件事是,C规则以各种方式内置到优化器中,它可以进行完全合法但意外的推断。一旦优化器推断出某段代码的计算结果1nice One答:)