本文介绍位运算符的妙用
提示:最右为位为第 0 位
位运算符与加减速度相当,比乘除速度快很多
文章目录
前言
在日常使用中,位运算符可以带来很大的便捷,提供巧妙的运算。
位运算符分为以下六种:&(按位与)
一、& 按位与
1.1介绍 &
按位与是对二进制数进行操作。
若写法如下:
n = a & b;
则是将二进制数 a 与二进制数b的各位进行运算,若存在同为 1 的位,则记录那个位为 1 。若存在两个数同位有一个存在 0 的情况,则该位记录为 0 。
(以下是二进制写法)
例如:
有二进制数 a 与 b
a= 0000 0000 0000 0000 0000 0000 0001 1011
b= 0000 0000 0000 0000 0000 0000 0011 1000
则有
n= 0000 0000 0000 0000 0000 0000 0001 1000
可以理解为:对每一位都做一次询问,问是否都为 1 ,如果是则返回为真(1),反之返回为假(0)。
1.2 & 的常用技巧
按位与(&)大致用途有下列两种:
A、取二进制数的某一位
取某一位即判断该位是否为 1 ;
如判断第七位:
if((n&0x80==0x80)
return true;
B、某些位清零,其他位不变
如下操作:
n=n&0xffffff00;
可以将某数 n 的后两位设置成0。
二、| 按位或
2.1 介绍 |
在两个数同位任意存在1 的时候便判断为 1 。用法如下写法:
n = a | b;
(以下为二进制写法)
若有
a=0000 0000 0001 0001
b=0000 0001 0001 0000
则
n=0000 0001 0001 0001
可以理解为:对每一位都做一次询问,问是否存在 1 ,若回答是,则返回为真(1),反之则返回为假(0)。
2.2 | 的常用技巧
A、某些位变成 1 ,其它位保持不变
n = n | 0xff;
如上便是将低八位都设置成 1 。
n = n | 0x80;
如上便是将第七位设置成 1 ,其它位保持不变。
3 ^ 按位异或
3.1 介绍 ^
两个数只有在同位相同(同为 1 或者 0 )的情况下,该位判断为 0 ,否则为 1。写法如下:
n = a ^ b;
(以下是二进制写法)
若有
a=0000 0000 1100 1111
b=0110 0100 0011 1000
则有
n=0110 0100 1111 0111
可以理解为:对每一位都做一次询问,问是否不同,如果回答是,那么则返回为真(1),反之则返回为假(0)。
3.2 ^ 的常用技巧
A、对某一位取反
例如:
想要对第 7 位取反,则有
n = n ^ 0x80;
将低八位全部取反
n = n ^ 0xff;
想要将哪一位取反,则将哪一位设置为 1 ,其他位数为 0 。
B、交换两个数的值
写法如下:
a = a ^ b;
b = a ^ b;
a = a ^ b;
4 ~ 按位非
按位非是将二进制数各位全部取反,是一个单目运算符。
写法如下:
a = ~a;
二进制数在内存中以补码的形式存储。
按位取反:二进制每一位取反,0变1,1变0。
~9的计算步骤:
转二进制:0 1001
计算补码:0 1001
按位取反:1 0110
转为原码:
按位取反:1 1001
末位加一:1 1010
符号位为1是负数,即-10
5 << 左移运算符
左移运算符可以完成数对 2^n 的乘除运算,效率很高,比乘与除快很多。
它是对一个二进制数进行向左移位操作,多余位数补上 0 。
例如:
a = 0100
a<<=1;(左移一位,写法等同于 a=a<<1)
a = 1000
左移多少位即乘上 2 的多少次方。
比如左移 3 位就是乘上 2 的 3 次。
6 >> 右移运算符
右移运算符类似于左移运算符,但是它对最高位的处理基本有一下规定:
最高位如果原来为 1 ,那么右移之后也为 1 ,反之则为 0 。
例如:
-25 >> 4 = -2
-4 >> 2 = -1
-4 >> 4 = -1
10 >> 3 = 1
命右移数为 n ,那么则除以 2^n ,如果有小数,则向更小数取整。