C 语言中位运算包括下面几种:
前4 种操作很简单,一般不会出错。但要注意按位运算符|和&与逻辑运算符||和&&完全是两码事,别混淆了。其中按位异或操作可以实现不用第三个临时变量交换两个变量的值:
a ^= b; b ^= a;a ^= b;但并不推荐这么做,因为这样的代码读起来很费劲。
再看看下面的例子:
0x01<<2+3;
结果为7 吗?测试一下。结果为32?别惊讶,32 才是正确答案。因为“+”号的优先级比移位运算符的优先级高(关于运算符的优先级,我并不想在这里做过多的讨论,你几乎可以在任何一本C 语言书上找到)。好,在32 位系统下,再把这个例子改写一下:
0x01<<2+30;或0x01<<2-3;
这样行吗?不行。一个整型数长度为32 位,左移32 位发生了什么事情?溢出!左移-1位呢?反过来移?所以,左移和右移的位数是有讲究的。左移和右移的位数不能大于数据的长度,不能小于0。