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答:)