目录

一、位运算总共有5总运算:

二、每种运算都有相应的性质:

三、位运算基础上扩展的一些解法


在实际中,由于计算机采用的是二进制存储,所以关于位运算的操作能够实现并简化很多复杂问题。

一、位运算总共有5总运算:

与(&)、或(|)、异或(^)、左移(<<)、右移(>>)。

二、每种运算都有相应的性质:

1.与:都真才真。任何数与0相与都为0,任何数与1相与都为其本身;

2.或:都假才假。任何数与0相或都为其本身,任何数与1相或都为1;

3.异或:任何数与1异或得到其相反数,任何数与0异或得到其本身,任何数与自身异或结果为0;

(1)交换律: A ^ B = B ^ A

(2)结合律: ( A ^ B ) ^ C = A ^ ( B ^ C )

(3)自反性: A ^ B ^ B = A (由结合律可推: A ^ B ^ B = A ^ ( B ^ B ) = A ^ 0 = A)

所以异或能完成数之间的交换以及排除偶次重复

//a与b的交换
a = a ^ b;  // a = 3 ^ 7
b = a ^ b;  // b = (3 ^ 7) ^ 7 = 3 ^ (7 ^ 7) = 3 完成b = a
a = a ^ b;  // a = (3 ^ 7) ^ (3 ^ 7 ^ 7) = (3 ^ 3) ^ (7 ^ 7) ^ 7 = 7 完成a = b
// 常规方法:通过二次循环找出不重复的数字
for (...) {for (...) {...}
}// 异或方法:将所有整数异或,出现偶数次的整数会被抵消,最终留下不重复整数。
int result = 0;
for (int index = 0; index < numArray.length; index++) {result = result ^ numArray[index];
}
return result;

4.左移与右移

效率比乘除高,但是要注意一点:

在二分法中,求中点的时候,不能(left+right)>>2;因为直接相加可能溢出,最好用下面的方式。

int left, right, mid;
mid = left + (right - left)/2;

三、位运算基础上扩展的一些解法

1.统计一个数中1的个数:

while(n){n = n&(n-1);++res;
}
return res;

比如两个数的汉明距离,可以先异或再统计1的个数

class Solution {
public:int hammingDistance(int x, int y) {//先异或得到结果n//统计结果n中1的个数 n与n-1位与一次能消除掉n最右边的1int n = x^y;int res = 0;while(n){n = n&(n-1);++res;} return res;}
};

计算机中位运算的一些性质与技巧相关推荐

  1. C/C++中位运算操作符的使用

    C/C++中位运算操作符的使用 介绍 使用 "与"运算符 "或"运算符 "取反操作" "异或"运算符 "左移& ...

  2. 算法之美 | 位运算的巧妙奥秘(一) | JAVA中位运算的深入浅出

    文章目录 前言 一.位运算符号 二.位运算的运算规则 扩展 前言 传智杯初赛后有感而写,我目前阶段所学习的算法,只是最基础的数学,对于数字和数学公式还是不敏感,在小卡与质数2那道题,解题的思路只有最基 ...

  3. c语言中位运算之布尔运算

    c语言中位运算中的布尔运算有:&.|.~.^ &:按位与 |:按位或 ~:按位非 ^:按位异或,相同为0,相异为1. 计算规则如下: 位的逻辑运算的作用: 使用位向量做集合编码: 使用 ...

  4. c语言位运算负数的实例_一招教你学会C语言中位运算

    程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.注意,位运算只针对于整数进行操作. 运算符号 运算规则 1.&与运算:对应两个二进 ...

  5. C语言截取整数的某些位编程,C语言中位运算的巧用(转)

    一 .位运算实例 1.用一个表达式,判断一个数X是否是2的N次方(2,4,8,16.....),不可用循环语句. X:2,4,8,16转化成二进制是10,100,1000,10000.如果减1则变成0 ...

  6. java 位与运算_java中位运算和移位运算详解

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

  7. C++中位运算的使用方法

    一:简介 1 位逻辑运算符: & (位   "与")  and       ^  (位   "异或")       |   (位    "或& ...

  8. java中位运算详解

    位运算 什么是位操作? 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算就是直接对整数在内存中的二进制位进行操作.比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算 ...

  9. 计算机中位(bite),字节(Byte),字,字长的概念

    一.在性能测试当中,任何脱离底层的内容,对于性能测试来讲,都是不完整的,任何程序,何何中间件如果没有操作系统及计算机支撑,都是毫无意义的,因为在计算机世界里,有一些概念需要我们能够掌握和了解,比如说: ...

最新文章

  1. 日志管理最佳实践:成功的六要诀【解读版】
  2. v2.matchTemplate图片尺寸问题
  3. CDE桌面环境中自动启动应用程序图形界面
  4. 我来告诉你优秀的产品经理是如何管理需求的
  5. struts2获取请求参数的三种方式及传递给JSP参数的方式
  6. nginx中的nginx.conf.default配置
  7. linux 高级IO函数之sendfile splice tee
  8. svpwm仿真_【好物推荐】《现代永磁同步电机控制原理及MATLAB仿真》
  9. 佳士得首次NFT竞拍已经开始,目前竞拍价为180万美元
  10. Linux PS 命令详解
  11. 前端和java选哪个_web前端和java哪个好?新手该选择哪个
  12. php 转换中文乱码,解决php中文乱码转换问题
  13. Windows内存体系(4) -- 内存映射文件
  14. 心不隔离|愿春早来,花枝春满
  15. catalina 无法验证macos_macOS Catalina 无法安装是什么原因?
  16. SimCSE 对比学习方法
  17. WWDC苹果开发者大会--直播
  18. 使用GDI+实现动态设置分级断点值
  19. NDK开发(四):仿QQ变声
  20. MySQL数据库深度讲解

热门文章

  1. MacBook开机自动连接iPad好评
  2. 山重水复疑无路,柳暗花明又一村
  3. 【转】深入了解CPU两大架构ARM与X86
  4. 从 SPIR-V 到 ISPC:将 GPU 计算转化为 CPU 计算
  5. Js判断下拉框是否为空值
  6. poj 2683 Ohgas#39; Fortune 利率计算
  7. J-4 Java语言基础
  8. WPF的ProgressBar进度条
  9. Console-算法[]-数组求最大值和最小值(只能遍历一次)
  10. Linux初到者五个最易犯的错误