C语言中的位运算& ^ |

一、一些面试题

例一、

用一个表达式,判断一个数X是否为2的N次方,不用循环语句。

结果:!(X&(X-1))

例二、

取两个变量中较大数,不适用if,?,switch或其他判断语句。

结果:int max = (a+b+abs(a-b))/2

例三、

不使用中间变量交换a,b。

结果: 

 a = a^b;
 b = a^b;
 a = a^b;

例四、取0的反码。

错误写法:

unsigned int zero = 0;

unsigned int zerocomplement = 0Xff;

正确写法:

unsigned int zero = 0;

unsigned int zerocomplement = ~zero;

说明:需要考虑到在不同字长的机器上的移植性,错误写法默认16位,只能在16位机上运行,二使用位运算写的代码将不受字长限制,具有很好的移植性。

 例五、下面代码:

    int f(int x, int y)

   {

       return (x&y+(x^y)>>1);

    }

二、嵌入式系统中的典型应用。

应用一:将寄存器中的某一位置1或则清0,保持其他位不变。

int l_data;
void SetBit(int pos)//将某一位置位的操作
{
 if((pos >= 0) && (pos <= 31))
 {
  l_data |= BIT_MASK(pos);
 }
}
void ClrBit(int pos)//将某一位清0的操作
{
 if((pos >= 0) && (pos <= 31))
 {
  l_data &= ~BIT_MASK(pos);
 }
}

你可能感兴趣的:(C语言中的位运算& ^ |)