常用技巧 —— 位运算 —— 位运算基础

【与运算】

与运算常用于二进制的取位操作,其用符号 & 表示,相同位的两个数字都为1,则为1,若有一个不为1,则为0。

例如:00101 & 11100 = 00100

其会将两个十进制数在二进制下进行与运算,然后返回其十进制下的值。

例如:3(11) & 2(10) = 2(10)

典型应用:任意一个数 &1 的结果就是取二进制的最末位,常用于判断数的奇偶,最末位为 0 表示该数为偶数,最末位为 1 表示该数为奇数。

【或运算】

或运算常用于二进制特定位上的无条件赋值,其用符号 | 表示,相同位的两个数字只要一个为 1 即为 1。

例如:00101 | 11100 = 11101

其会将两个十进制数在二进制下进行或运算,然后返回其十进制下的值。

例如:3(11)|2(10)=3(11)。

典型应用:一个数 | 1 的结果就是把二进制最末位强行变成 1,如果需要把二进制最末位变成 0,对这个数 | 1 后再减一即可,其实际意义就是把这个数强行变成最接近的偶数。

【非运算】

非运算是把内存中的 0 和 1 全部取反,用符号 ~ 表示。

使用非运算时要格外小心,需要注意整数类型有没有符号,如果非运算的对象是无符号整数,那么得到的值就是它与该类型上界的差,因为无符号类型的数是用 00 到 $FFFF 依次表示的。

【异或运算】

异或运算,是对等长二进制模式按位执行逻辑按位异或操作,用符号 ^ 表示,如果某位不同则该位为 1,否则该位为 0。

例如:00101 ^ 11100 = 11001

其会将两个十进制数在二进制下进行异或运算,然后返回其十进制下的值。

例如:3(11) ^ 2(10) = 1(01)

异或运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即:(a ^ b) ^ b = a

【左移与右移】

1.左移运算

左移运算,用符号 << 表示,操作 a << b 就是把 a 转为二进制后左移 b 位(在后面填充 b 个 0),实质上就是 a 乘以 2 的 b 次方,因为在二进制数后添一个 0 就相当于该数乘以 2。

例如:100(1100100) << 2 = 400(110010000)

通常认为,a << 1 比 a*2 要更快,因为前者是更底层的操作,因此程序中乘以 2 的多少次方的操作尽量用左移位来代替。

2.右移运算

右移运算,用符号 << 表示,操作 a >> b 就是把 a 转为二进制后右移 b 位(去掉末尾 b 个 0),实质上就是 a 除以 2 的 b 次方(取整)。

例如:400(110010000) >> 2 = 100(1100100)

通常认为,a >> 1 比 a/2 要更快,因为前者是更底层的操作,因此程序中除以 2 的多少次方的操作尽量用右移位来代替。

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页