简介

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++中位运算的更多相关文章

  1. js中位运算的运用

    原文:js中位运算的运用 我们可能很少在编程中用位运算,如果没深入学习,可能也很难理解.平时的数值运算,其实是要先转换成二进制再进行运算的,而位运算就是直接进行二进制运算,所以位运算的执行效率肯定是更 ...

  2. LeetCode解题中位运算的运用

    位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...

  3. 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 ...

  4. java中位运算和移位运算详解

    一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算        分别看一下正数和负数的具体运算步骤 ...

  5. java中位运算^,&,<<,>>,<<<,>>>总结

    1.^(亦或运算) ,针对二进制,相同的为0,不同的为1 public static void main(String[] args) { System.out.println("2^3运算 ...

  6. C语言中位运算异或“∧”的作用

    1.概念异或运算符"∧"也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即 0∧0=0,0∧1=1, 1^0=1,1∧1=0.运算    ...

  7. php中位运算的应用:货品的状态

    效果如下图: 分析:用一个整数的二进制可以记录32状态 00000000 00000000 00000000 00000000  >>=0 从右往左保存这三个的状态: 精品选中,第一位设置 ...

  8. go中位运算

    左移右移 const ( // 将 1 左移 100 位来创建一个非常大的数字 // 即这个数的二进制是 1 后面跟着 100 个 0 Big = 1 << 100 // 再往右移 99 ...

  9. javascript中的位运算,

    罗浮宫群里又有讨论位运算符号|了,做过一段时间php,数据库保存布尔值数据经常用到,比如100110 就表明了六个属性的是与否,极大减少了数据量..] ECMAScript 中位运算跟其他语言一样的. ...

随机推荐

  1. [administrative][CentOS] 新装系统时如何正确精准的选择基础环境和软件包

    出于不同的目的,在进行全新CentOS安装的时候,我们到底应该如何作出选择. 是mininal,base server, base web server, 还是啥? 答案在这里: https://ac ...

  2. oplog

    参考资料:https://www.cnblogs.com/ruizhang3/p/6539730.html http://www.jb51.net/article/113432.htm :insert ...

  3. 内部排序->基数排序->链式基数排序

    文字描述 基数排序是和前面各类排序方法完全不相同,前面几篇文章介绍的排序算法的实现主要是通过关键字间的比较和移动记录这两种操作,而实现基数排序不需要进行记录关键字间的比较.基数排序是一种借助多关键字排 ...

  4. vue打包后出现"Failed to load resource: net::ERR_FILE_NOT_FOUND"错误

    创建vue脚手架搭建项目之后,用npm run build经行打包,运行index.html后出现异常: 打开dist/index.html, 诸如这些的,引入是有问题的, 这边的全部是绝对路径,而本 ...

  5. linux基本介绍和使用

    基本介绍 Linux入门教程 快捷键     linux 快捷键 用户及用户组 linux之用户和用户组

  6. AT2046 Namori 图论

    正解: 解题报告: 传送门! 首先看数据范围可以发现要么是棵树要么是个奇环要么是个偶环 然后就分类讨论分别看下这几个情况 首先是棵树的 首先可以想到树的情况就是个二分图,所以不妨把颜色重定义,让奇数层 ...

  7. 基于w2v词向量聚类出现的问题(有待解决)

    1.训练词向量代码如下:#训练词语为向量表示def w2v_train(self): ques = self.cu.execute('select question from activity')#将 ...

  8. 连连看java版

    主界面 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt. ...

  9. MongoDB pymongo模块 删除数据

    使用user集合,删除user集合的数据 import pymongo mongo_client = pymongo.MongoClient( host='192.168.0.112', port=2 ...

  10. dedecms自定义表单提交成功后提示信息修改和跳转链接修改

    我们在用dedecms自定义表单提交成功后提示信息一般是"Dedecms 提示信息",这个要怎么改成自己想要的文字呢?还有就是提示页停留时间,目前估计就2秒,太快了,要如何设置长点 ...