1. 按位运算符能够针对数字的每一位进行操作,数据操作的背后是按照2进制的方式进行的。
2. 截至目前,在C++中,按位运算符一共有6个(<<、>>、&、|、^、~)
按位运算符号的用法
1) << 和 >>
表达式:数值 << 移动位数
左移操作符<<是对于数字中的位数进行移位处理。左移意味着数字对应的二进制中的每一位都都需要向左边移动,我们知道的是,二进制的每一位越往左,越大,,空出来的位置用0补上。
·以13(10进制)为例,13(10进制)所对应的2进制为“0000000000001101”,左移3位,对应的2进制为“0000000001101000”,你看,1101向左边移动了3个位置,而原先的位置,被0填充。我们可以推算出来,往左边移动一位(2进制),代表将原先的数字乘以“2”(类比10进制),移动两位,代表将原来的数字乘以“4”,移动三位,代表将原来的数字乘以“8”,移动“n”位,代表将原先的数字乘以“2的n”次方。
表达式:数值>>移动位数
·以13(10进制)为例,13(10进制)所对应的2进制为“0000000000001101”,右边移3位,对应的2进制为“0000000000000110”,你看,1101向左边移动了3个位置,多出的位置,被删除。我们可以推算出来,往右边移动一位(2进制),代表将原先的数字除以以“2”(类比10进制),移动两位,代表将原来的数字除以以“4”,移动三位,代表将原来的数字除以“8”,移动“n”位,代表将原先的数字除以“2的n”次方。
注意:int x = 13; std::cout<< (x<<3)<<std::endl; std::cout<<x<<std::endl; 输出的值为:104\n 13 也就是说,移位并没有改变变量的值,而是重新生成一个值,如果要得到新的值,可以这么写:x = (x<<3); 那么,x的值就被改为104了。(右移运算符类似)
2) 逻辑按位运算符
~是“求反运算符”,那么~x怎么计算呢。首先,将十进制的x换算成二进制的数,然后将0变为1,1变为0,得到的数字转为10进制,得到的新值就是原值的补值。
|是或,是针对两个数字进行或运算的,同样,需要针对两个二进制的数字。(被操作的两个值的每一位中至少有1个是1,则为1,否则为0)
int main() {
// a = 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0
// b = 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1
// a|b = 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1
std::cin.get();
}
混合运算“a|=b”: 意味着将a变为“a|b”。
XOR(^)是异或运算符(被操作的两个数字位中,只有一个为1,则为1,其余都为0)
int main() {
// a = 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0
// b = 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1
// a^b = 1 1 1 0 0 1 0 1 0 1 0 1 0 0 0 1
std::cin.get();
}
同样的,混合运算“a^=b”: 意味着将a变为“a^b”。
AND(&)是和运算符(只有被操作的两个数字位中,全部为1,则为1,其余的都为0)
int main() {
// a = 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0
// b = 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1
// a&b = 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
std::cin.get();
}
依然,混合运算“a&=b”: 意味着将a变为“a&b”。
3. C++为我们提供了运算符的替代表示。
#include <iso646.h>
int main() {
int a = 13;
// bitand --> &;
// and_eq --> &=;
// bitor --> |;
// or_eq --> |=;
// compl, --> ~;
// xor, --> ^;
// xor_eq, --> ^=;
std::cin.get();
}