您的位置:首页 > 其它

<9> 位操作知多少

2018-01-05 11:39 387 查看
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();
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: