1.&按位与
2.| 按位或
3. 按位异或 ^
4.按位取反~
5.<<左移
6.>>右移
应用一:
应用二:求两数之和
求两数之差;
位运算符号优先级别从高到低:~ & ^ |;

其中~自由向左

1.&按位与
0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1。
即同为1才为1;

C++输出一个数的二进制; 头文件#include;
如果a为int,其二进制为:(bitset<32>(a))
如果其为long long,(bitset<64>(a))

2.| 按位或
0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1
即有一个为1即为1;

  1. 按位异或 ^
    0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0
    即相同为0,不同为1;

int a=3;
a=a^0;//任何一个数与0异或都为原数;
int b=3;
a=a^b;;//一个数和另一个相等的数异域或为0;
int c=4;

异或的另一个用处是交换元素不用申请变量;
int a;
a=a^b;
b=b^a; //b=bab;
a=a^b; //a=ababb;

4.按位取反~
哪些为0的位,结果是1,而哪些为1的位,结果是0。例如, ~7的结果为0xfff8。

5.<<左移
左移:向左移动,右补0
移动n位,则相当于原数* 2^n;

6.>>右移
向右移动,无符号左补零,有符号(整数左补0,负数左补零或1)
应用一:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

解题思路:
首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身。
当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消了。
依照这个思路,我们来看两个数(我们假设是AB)出现一次的数组。我们首先还是先异或,剩下的数字肯定是A、B异或的结果,这个结果的二进制中的1,表现的是A和B的不同的位。我们就取第一个1所在的位数,假设是第3位,接着把原数组分成两组,分组标准是第3位是否为1。如此,相同的数肯定在一个组,因为相同数字所有位都相同,而不同的数,肯定不在一组。然后把这两个组按照最开始的思路,依次异或,剩余的两个结果就是这两个只出现一次的数字。

class Solution {
public:
void FindNumsAppearOnce(www.fdouyf.com data,int* num1,int *num2) {
int xor1=0;
for(int i=0;i<data.size();i++)
xor1=xor1 ^ data[i];//求出不同的两个数的异域
int index=1; //求出第一数所在区间,即将数组非为两个区间
while((xor1 & index)==0) //与结果为0,继续执行,不为零则退出
index=index<<1;
int r1=0;
int r2=0;
for(int i=0;i<data.size();i++)
{
if((data[i]&index)==0) //如果第i位不为1则,与r1异或
r1=r1^data[i];
else
r2=r2^data[i];
}
*num1=r1;
*num2=r2;
}
};

应用二:求两数之和
不用加减乘除完成两个数相加;
思路:
& 按位与运算:相同位的两个数字都为1,则为1;若有一个不为1,则为0。两个数相与,并左移一位:相当于求得进位
1&1=1 将1左移一位变成了10,相当于拿到了进位。
^ 按位异或运算:相同位置不同则为1,相同则为0。相当于每一位相加,而不考虑进位。
第一步 异或——无进位相加得result1 (a^b)
第二步 与+左移一位——求得进位result2 (a&b)<<1
第三步 result = result1 + result2即是结果
但问题在于,result1 + result2可能还有进位,因此result还要重复一二步这个过程。直到没有进位,异或的结果就是最终的结果为止
如 101 + 011 -> 110 + 1010 -> 1100 + 0100 -> 1000 + 1000 -> 0 (异或出现了0,返回上一次异或的结果)
最终得到的是1000 也就是5+3=8

class Solution {
public:
int Add(int num1, int num2)
{
int temp;
do{
temp=num1^num2;
num1=(num1 & num2)<<1;
num2=temp;
}while(num1!=0);
return temp;
}
};

求两数之差;
根据C++上两个互为相反数的int型数据的二进制结构关系——整数的相反数等于该数按位取反再加1;

int OppositeNumber(int n)
return Add(~n, 1);
int Subtract(int a, int b)
return Add(a, OppositeNumber(b));

思路二:
如果减数不为0,我们可以先把被减数和减数上同为1的位从两个数上去除。至于如何分离出值同为1的位,则可以通过求位与操作来做到;
而把这些1分别中被减数和减数中去除,则可以通过按位异或来的操作来实现。
经步骤1处理后,被减数和减数在对应的位上,将或者通为0,或者分别为0和1,却不会同为1。此时:
如果对应位被减数=0,而减数=1,则所得结果对应位还是1,但此时须向前一位借1;
== 即通过对减数左移一位得到需从临时结果中减去的借数。==
于是,经过步骤2后,原来的减法变成了要求:临时结果 - 借数
很明显,只要以临时结果为被减数,借数为减数,重复步骤1~3即可。
int Subtract(int a,int b)
{
while(b!=0)
{
int sameBits=a&b;//计算出两个数同为1的位;
a=a^sameBits;//分别求出a为1的位;对于的位b为0;
b=b^sameBits;
a=a|b; //不同位的求和;
b=b<<1;//借位,右移动; 如011010;执行到00000循环退出
}
return a;
}

加减乘除的实现————————————————

C++ 与、或、异或、取反等运算相关推荐

  1. 位运算(按位与、按位或、异或、取反)以及原码、反码、补码

    参考:运算符的计算(按位与 按位或 异或 取反) 作者:一只青木呀 发布时间: 2020-07-23 18:13:55 网址:https://blog.csdn.net/weixin_45309916 ...

  2. 与() 、或(|)、异或(^) 、取反(~) 运算

    一.与(&) 参加运算的两个数据,按二进制位进行"与"运算. 运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; 例如:15& ...

  3. c语言负数左移右移_C语言位运算符:与、或、异或、取反,左移和右移

    C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...

  4. c语言 10进制 按位与,位运算小结(按位与、按位或、按位异或、取反、左移、右移)...

    原标题:位运算小结(按位与.按位或.按位异或.取反.左移.右移) 位运算不管是在Java语言,还是在C语言中,或者其他语言,都是经常会用到的,所以本文也就不固定以某种语言来举例子了,原始点就从0.1开 ...

  5. 位运算小结(按位与、按位或、按位异或、取反、左移、右移)

    位运算小结(按位与.按位或.按位异或.取反.左移.右移) 位运算主要包括按位与(&).按位或(|).按位异或(^).取反(~).左移(<<).右移(>>)这几种,其中除 ...

  6. 基于异或,取反和循环移位实现一个简单的加密解密函数

    // 字节循环右移 unsigned char RorByte(unsigned char bData, size_t shift) {unsigned char temp = bData >& ...

  7. 内存中原码,反码,补码,查看数值范围,,或,异或,取反,左右移位操作

     1.补码,计算机二进制在内存中如何显示的就是补码 2.查看每种数据类型的范围 如果想输出无符号整型,使用的是UINT_MAX可以得到长度. 3.原码,反码,补码 正数:原码,反码,补码都是相同的 ...

  8. 左移和右移的运算规则_一文读懂JavaScript位的与、或、异或、取反及左移右移操作...

    JavaScript基础教程二进制位运算 JavaScript中的位运算是针对二进制数据提供的运算与操作.在JavaScript标准中规定了二进制位运算时其操作数长度为32位,其最高位为符号位,因此能 ...

  9. 运算符 相与、相或、相异或、取反、左移、右移

    运算 符号 解释 例子 与 & 两个数字相与:当两个数字对应的二进位均为1时,结果位为1,否则为0.参与运算的数以补码出现. 3&5 => 0000 0011 & 000 ...

最新文章

  1. Python 获取字符串的第一位和最后一位的字符
  2. Codeforces 757C - Felicity is Coming!
  3. sharepoint2013保存当前输入的列表
  4. vpc 网络隔离_专有网络(VPC)的六大应用场景
  5. 在网页中插入百度地图(实例)
  6. 树莓派超声波车牌识别系统
  7. SqlServer表中两条全然同样的记录,怎样删除当中1条
  8. OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
  9. 将米转换为度(经纬度) 画圆上下多出来一些区域
  10. 【Pycharm】连接远程服务器并进行代码上传、调试
  11. 微星小飞机怎么超频?
  12. 世界名着100部简介
  13. Grammarly:最优秀的日常英文写作辅助工具——论文英文校验
  14. 在Linux和Windows上安装kafka(版本:2.12-2.8.0)
  15. 2022年流动式起重机司机考试题库模拟考试平台操作
  16. 【Python】通过构造树结构解析查询条件
  17. 用python输入概率分布,计算信源熵/信息熵
  18. java行程单解析获取内容_java如何抓取网页上的动态信息,获取源代码后如何分析JS?...
  19. C# 使用NPOI批量导出
  20. 邓俊辉数据结构学习笔记1

热门文章

  1. CC2640 蓝牙动态切换广播数据
  2. 最好用的ftp客户端:SecureFX for Mac
  3. Type Qualifier (GLSL)--GLSL类型修饰词
  4. JavaWeb Tomcat服务器与Servlet入门以及简单登录功能的实现
  5. 10款Github上最火爆的国产开源项目
  6. [转载]投资正道vs冯时能30年股票投资16心得
  7. 计算机维修中拆机工具有哪些,秒变专业拆机维修达人,这款工具套装你值得拥有...
  8. 中间件-MyCat学习笔记
  9. Java转义字符及其释义
  10. Kaggle - Home Depot Product Search Relevance 基础篇