<9> 位操作知多少

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();
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值