置位可以用或操作符"|"实现:
y = x | (1<<n);
清除可以用与操作符"&"实现:
y = x & (~(1<<n));
取反可以用异或操作符"^"实现:
y = x ^ (1<<n);
bit提取操作:
y = x | (1<<n);
清除可以用与操作符"&"实现:
y = x & (~(1<<n));
取反可以用异或操作符"^"实现:
y = x ^ (1<<n);
bit提取操作:
bit = (x | (1<<n))>>n;
一般来说,用位运算就是对位操作。位运算包括
^ 异或
| 位或
& 位与
~ 位求反
>> 右移位
<< 左移位
对位操作的好处是快,并且基本上和汇编一一对应,可以直接算出运算时间,计算速度。
很多要表达硬件计算,或者提高运算速度的时候,都会直接用位运算。
比如乘16,位运算就是左移4位等等。
另外一种是位域。
就是定义一种特殊的结构体,里面的成员只有规定的几位。
比如
struct instruction{
unsigned short sr:5;
unsigned short tr:5;
unsigned short op:6;
};
就定义了一个16bit指令的结构,其中
sr : tr : op
1-5 : 6-10 :11-16
然后就可以这样操作
struct instruction mov_r1_r3 = {0x01, 0x03, 0x01};
那么mov_r1_r3实际上等于0x0461
这样编代码一般是为了和硬件接口容易,完全的底层操作
实际代码中极少出现,一般出现于与硬件的接口当中.