前言
前几天在看《STL源码剖析》时看到一段这样的代码 return ( (bytes) + __ALIGN - 1) & ~ (ALIGN -1)); //将 bytes 上调至 8 的倍数。虽然有注解,但当时对着这段代码真的是半天没有反应过来。直觉告诉我应该看看 C/C++ 的运算符了,这里主要复习位运算符的知识,其他的运算符,可以敲代码试一试。
其实有一些系统的源码会用到位运算,看这些源码的时候,要对 C++ 中的运算符比较熟,最起码要知道每一个运算符的含义才能看懂代码。例如下面的代码是一些位运算,其中就用到了这类知识。
int32_t Func::set_bit(int32_t& data, int32_t index){
return (data |= (1 << index)); // 1 左移 index 位后与 data 或
}
int32_t Func::clr_bit(int32_t& data, int32_t index){
return (data &= ~(1 << index)); // 将设置的 1 清除, ~ 的效果是翻转位,即 0 变成 1, 1 变成 0。
}
int32_t Func::test_bit(int32_t data, int32_t index){
return (data & (1 << index)); // 判断该位是不是 1
}
算数运算符
关系运算符
逻辑运算符
位运算符
代码如下:
#include <iostream>
using namespace std;
int main()
{
int A = 60, B = 13;
cout << "A&B: " << (A & B) << endl;
cout << "A|B: " << (A | B) << endl;
cout << "A^B: " << (A ^ B) << endl;
cout << "~A: " << ~A << endl;
cout << "A<<2: " << (A<<2) << endl;
cout << "A>>2: " << (A>>2) << endl;
return 0;
}
转化为二进制分析:
十进制:A = 60, B = 13
二进制:A = 0011 1100
二进制:B = 0000 1101
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001 //异或,相同为0,不同为1
~A = 1100 0011 //取反
现在再看看《STL源码剖析》中的 return ( (bytes) + __ALIGN - 1) & ~ (ALIGN -1)); // 有定义enum { __ALIGN = 8 };
这里将代码分成两部分 [(bytes) + __ALIGN - 1)] & [~(ALIGN -1)]
其中bytes是我们输入的值
当我们输入的bytes = 13时,先将和20转化成二进制:10100 //占5位
7的二进制为:00111 所以~(7):11000
20 10100
~(7) 11000
&
16 10000 //结果是16
赋值运算符
其他运算符
运算符优先级