<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)
XOR(^)是异或运算符(被操作的两个数字位中,只有一个为1,则为1,其余都为0)
AND(&)是和运算符(只有被操作的两个数字位中,全部为1,则为1,其余的都为0)
3. C++为我们提供了运算符的替代表示。
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(); }
相关文章推荐
- <9>—— Palindrome Number
- <10/9>打卡随笔
- <9>soc sensor与bayer sensor 区别,内外置isp
- <模型汇总-9> Variational AutoEncoder_VAE基础:LVM、MAP、EM、MCMC、Variational Inference(VI)
- <9>python学习笔记——文件操作
- <Win32_9>SetWindowRgn函数的应用——绘制个性化形状的窗口
- <10/9>打卡随笔
- 人体自身的神奇补肾法 ——你在外面花多少钱都学不到的<转>
- <模型汇总_9> 深度学习网络的表达方式汇总及模型分类方法
- <9> 素数
- <设计模式9>观察者模式
- <9> 函 数
- <JAVA学习笔记9>——网络之Socket的简单介绍
- <9>soc sensor与bayer sensor 区别,内外置isp
- <8/9>集训日记
- <jsp:include>与<jsp:forward>
- <0-1>学习之前的准备
- <NET CLR via c# 第4版>笔记 第16章 数组
- <<Effective c++>>读书笔记---条款19:设计class犹如设计type
- <Effective Mordern C++>笔记:Item 3:Understand decltype .