C++中位运算
简介
1 位逻辑运算符:
& (位 “与”) and ----------------- 2个都为1 才是1-----------0^0 = 0 , 0^1 = 0, 1^0 = 0 1^1= 1
^ (位 “异或”) ---------------------相同为0,不同为1--------0^0 = 0 , 1^1 = 0, 1^0 = 1 1^0 = 1
| (位 “或”) or------------------有一个是1 就是1 -------------0^0 = 0 , 0^1 = 1, 1^0 = 1 1^1 = 1
~ (位 “取反”)
2 移位运算符:
<<(左移)
>>(右移)
优先级
& 》 ^ 》
应用:
1、&运算
&运算通常用于二进制取位操作,例如一个数 &1的结果就是取二进制的最末位。
这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数是偶数,最末位为1表示该数为奇数
2、| 运算
| 运算通常用于二进制特定位上的无条件赋值,例如一个数|1的结果就是把二进制最末位强行变为1
如果需要把二进制最末位变成0,对这个数 |1之后再减一就可以了,其实际意义就是把这个数强行变成最近接的偶数
3、^运算
leetcde:
^运算通常用于对二进制的特定一位进行取反操作,^运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a^b)^b=a;
^运算可以用于简单的加密,比如原始值int a = 19880516;密钥 int key =1314520; 进行加密 int data=key^a = 20665500;解密 data^key == a;
^运算还可以实现两个值的交换而不需要中间变量,例如:
先看加减法中交换实现
void swap(long int &a,long int &b)
{
a = a+b;
b = a-b;
a = a-b;
}
void swap(long int &a,long int &b)
{
a = a^b;
b = a^b;
a = a^b;
}
所以 ^运算可以理解成类似加法(+)记忆 , 1+1 =0,1+0 =1,0+1 =1;0+0 =0;//因为机器码是二进制,1+1=2%2 =0,其实不然
~运算的定义把内存中的0和1全部取反,所以~运算时要格外小心,你需要注意整数类型有没符号,如果~的对象是无符号整数(不能表示负数),
那么他的值就是它与它的上界限的之差,因为无符号类型的数是用0000到0000到FFFF依次表示的。
位运算技巧:
1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300%
x = x * 2;
x = x * 64;
//改为:
x = x << 1; // 2 = 21
x = x << 6; // 64 = 26
2. 如果除上一个 2 的倍数数值,可以改用右移运算加速 350%
x = x / 2;
x = x / 64;
//改为:
x = x >> 1;// 2 = 21
x = x >> 6;// 64 = 26
3. 数值转整数加速 10%
x = int(1.232)
//改为:
x = 1.232 >> 0;
4. 交换两个数值(swap),使用 XOR 可以加速20%
var t:int = a;
a = b;
b = t;
//equals:
a = a^b;
b = a^b;
a = a^b;
5. 正负号转换,可以加入 300%
i = -i;
//改为
i = ~i + 1; // NOT 写法
//或
i = (i ^ -1) + 1; // XOR 写法
6. 取余数,如果除数为 2 的倍数,可利用 AND 运算加速 600%
x = 131 % 4;
//equals:
x = 131 & (4 - 1);
7. 利用 AND 运算检查整数是否为 2 的倍数,可以加速 600%
isEven = (i % 2) == 0;
//equals:
isEven = (i & 1) == 0;
8. 加速 Math.abs 600% 的写法1,写法2 又比写法1加速 20%
//写法1
i = x < 0 ? -x : x;
//写法2
i = (x ^ (x >> 31)) - (x >> 31);
//写法3
i=x^(~(x>>31)+1)+(x>>31);
9. 比较两数值相乘之后是否拥有相同的符号,加速 35%
eqSign = a * b > 0;
//equals:
eqSign = a ^ b > 0;
其它位运算技巧
1. RGB 色彩分离
var 24bitColor:uint = 0xff00cc;
var r:uint = 24bitColor >> 16;
var g:uint = 24bitColor >> 8 & 0xFF;
var b:uint = 24bitColor & 0xFF;
2. RGB 色彩合并
var r:uint = 0xff;
var g:uint = 0x00;
var b:uint = 0xcc;
var 24bitColor:uint = r << 16 | g << 8 | b;
参考:https://blog.csdn.net/a1351937368/article/details/77746574/
参考:https://www.cnblogs.com/GlassHour/p/5522033.html
C++中位运算的更多相关文章
- js中位运算的运用
原文:js中位运算的运用 我们可能很少在编程中用位运算,如果没深入学习,可能也很难理解.平时的数值运算,其实是要先转换成二进制再进行运算的,而位运算就是直接进行二进制运算,所以位运算的执行效率肯定是更 ...
- LeetCode解题中位运算的运用
位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...
- java中位运算
1byte(字节)=8bit(比特) 1 0 0 0 0 0 0 0 1 2进制的1的原码 反码 补码 0 0 0 0 0 0 0 0 2进制的0的原码 反码 补码 -1 1 0 0 0 0 ...
- java中位运算和移位运算详解
一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算 分别看一下正数和负数的具体运算步骤 ...
- java中位运算^,&,<<,>>,<<<,>>>总结
1.^(亦或运算) ,针对二进制,相同的为0,不同的为1 public static void main(String[] args) { System.out.println("2^3运算 ...
- C语言中位运算异或“∧”的作用
1.概念异或运算符"∧"也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即 0∧0=0,0∧1=1, 1^0=1,1∧1=0.运算 ...
- php中位运算的应用:货品的状态
效果如下图: 分析:用一个整数的二进制可以记录32状态 00000000 00000000 00000000 00000000 >>=0 从右往左保存这三个的状态: 精品选中,第一位设置 ...
- go中位运算
左移右移 const ( // 将 1 左移 100 位来创建一个非常大的数字 // 即这个数的二进制是 1 后面跟着 100 个 0 Big = 1 << 100 // 再往右移 99 ...
- javascript中的位运算,
罗浮宫群里又有讨论位运算符号|了,做过一段时间php,数据库保存布尔值数据经常用到,比如100110 就表明了六个属性的是与否,极大减少了数据量..] ECMAScript 中位运算跟其他语言一样的. ...
随机推荐
- CAAnimationDelegate 代理方法没调用
CAAnimationDelegate 代理方法没调用 应该在 addAnimation调用之前设置代理
- 转: jquery中ajax回调函数使用this
原文地址:jquery中ajax回调函数使用this 写ajax请求的时候success中代码老是不能正常执行,找了半天原因.代码如下 $.ajax({type: 'GET', url: " ...
- LeetCode 892 Surface Area of 3D Shapes 解题报告
题目要求 On a N * N grid, we place some 1 * 1 * 1 cubes. Each value v = grid[i][j] represents a tower of ...
- 洛谷P4363 一双木棋chess [九省联考2018] 搜索+hash
正解:记搜+hash 解题报告: 传送门! 因为看到nm范围特别小,,,所以直接考虑爆搜(bushi 先考虑爆搜之后再想优化什么的嘛QwQ 首先对这种都要最优的,就可以直接把答案设为针对某一方,然后题 ...
- 终于解决“Git Windows客户端保存用户名与密码”的问题(转载)
add by zhj:不建议用这种方法,建议用SSH,参见 TortoiseGit密钥的配置 http://www.cnblogs.com/ajianbeyourself/p/3817364.html ...
- oracle日志归档空间清理
进入机器,设置环境变量,如: export ORACLE_HOME=/main/app/oracle/product//db_1 export ORACLE_SID=devdb 然后切换oracle用 ...
- java的错题整理
为了阅读方便,我们写代码时要缩进,以便于更好的理解代码 对象是是具有相同属性和共同行为的一组类的实例,不是集合. B是标准格式,D没有对象接收它,所以这样子. boolean的默认值是false如果一 ...
- HTML中--定义header和footer高度中间自适应
<html> <head> <meta charset="utf-8" /> <title></title> <s ...
- (转)深度教程:POS和POW全解析
如果你是一名资深的比特币矿工或商人,你一定听说过POW和POS,但是当前在国内,却几乎没有人明白这到底是什么意思,也几乎没有相关的中文资料,小编吐血撰写,是为了让大家更好理解这些概念. 读完本文, ...
- 【EatBook】-NO.2.EatBook.2.JavaArchitecture.1.001-《修炼Java开发技术在架构中体验设计模式和算法之美》-
1.0.0 Summary Tittle:[EatBook]-NO.2.EatBook.2.JavaArchitecture.1.001-<修炼Java开发技术在架构中体验设计模式和算法之美&g ...