文章目录

  • 一、位运算概述
  • 二、位运算概览
    • 异或
    • 二进制数的原码、反码、补码
    • 左移 <<
    • 右移 >>
    • 无符号右移 >>>
  • 三、位运算的使用奇巧淫技
    • 判断奇偶数
    • 获取二进制位是1还是0
    • 交换两个整数变量的值
    • 不用判断语句,求整数的绝对值
      • 整数取绝对值

一、位运算概述

计算机对于计算数据的说话,都是以二进制来进行运算的,所以使用位运算相比直接使用(+、-、 *、/)运算符,要更高效,能显著调高代码在计算机中的执行效率。

二、位运算概览

符号 描述 运算规则
& 两个位都为1时,结果才为1
| 两个位都为0时,结果才为0
^ 异或 两个位相同为0,相异为1
~ 非,取反 0变1,1变0
<< 左移 不分正负,低位补0
>> 右移 用符号位填充高位
>>> 无符号右移,逻辑右移 用0填充高位
a b ~a a&b a|b a^b
1 1 0 1 1 0
0 1 1 0 1 1
0 0 1 0 0 0

异或

异或,可以理解为不进位加法:1+1=0,0+0=0,1+0=1

性质:

  1. 交换律 可任意交换运算因子的位置,结果不变
  2. 结合律 (即(ab)c==a(bc))
  3. 对于任何数x,都有xx=0,x0=x,同自己求异或为0,同0求异或为自己
  4. 自反性 ABB = A^0 = A,连续和同一个因子做异或运算,最终结果为自己

二进制数的原码、反码、补码

  • 正数的原码、反码、补码都是一致的

  • 负数的反码,除了符号位与原码一致,其余位都与原码相反

  • 负数的补码 = 反码 + 1

    数据存储和运算都是以补码的方式进行的

左移 <<

左移使,不管正负,低位补0

正数 a = 20 << 2

20的二进制补码:0001 0100

向左移动两位后: 0101 0000

结果:a = 80

负数 a = -20 << 2

-20的二进制原码:1001 0100

-20的二进制反码:1110 1011

-20的二进制补码:1110 1100

左移两位后的补码: 1011 0000

反码:1010 1111

原码:1101 0000

结果:a = -80

右移 >>

如果该数为正,则高位补0,若为负数,则高位补1

正数 a = 20 >> 2

20的二进制补码:0001 0100

向右移动两位后:0000 0101

结果:a = 5

负数 a = -20 >>2

-20的二进制补码:1110 1100

向右移动两位后:1111 1011

反码:1111 1010

原码:1000 0101

结果:a = -5

无符号右移 >>>

无符号右移>>> 也叫逻辑右移,若该数位正数,则高位补0,若该数为负数,则右移后高位同样补0

正数 a = 20 >>>2 与 a = 20 >> 2相同

结果:a = 5

负数 a = -20 >>> 2

(int类型)

-20的二进制原码:10000000 00000000 00000000 00010100

反码:11111111 11111111 11111111 11101011

补码:11111111 11111111 11111111 11101100

右移:00111111 11111111 11111111 11111011

结果:a = 1073741819

三、位运算的使用奇巧淫技

判断奇偶数

int num = 101;
System.out.println(num +"是"+((num&1)==0?"偶数":"奇数"));

5的二进制代码为101,5与1运算就是 101与001做&运算。

我们通过二进制判断奇偶数的话,看的是二进制最后一位,如果最后一位为0的话是偶数,为1的话是奇数

为什么?因为二进制除了最后以为,其他位都是2的幂次方,必然是偶数,所以我们通过判断最后一位是0或者1 就可以判断是奇数还是偶数。

获取二进制位是1还是0

int n = 86;
System.out.println( n+"的第五位是"+ (((n&(1<<4))>>4)==0?"0":"1")   );
System.out.println( n+"的第五位是"+ (((n>>4)&1)==0?"0":"1")   );

交换两个整数变量的值

int num1 = 10;
int num2 = 20;
num1 = num1^num2;
num2 = num1^num2;
num1 = num1^num2;
System.out.println("num1="+num1+", num2="+num2);

不用判断语句,求整数的绝对值

int a = -10;
int b = ((a >> 31) ^ a) + (a >>> 31);
System.out.println("a="+a+", b="+b);

整数取绝对值

搞了一整天,,取绝对值的还是懵懵的

先来分析一下 a = -86:

原码:1000 0000 0000 0000 0000 0000 0101 0110

反码:1111 1111 1111 1111 1111 1111 1010 1001

补码:1111 1111 1111 1111 1111 1111 1010 1010

取反:0000 0000 0000 0000 0000 0000 0101 0101

(+1): 0000 0000 0000 0000 0000 0000 0101 0110

由此可以得出,负数的绝对值为,补码取反+1,即 ~a+1。

int a = -86;
int b = ~a + 1;
System.out.println(b);

但是,这个还不能达到题目所要求的,不用判断,当假定 a = -86的时候,就已经知到 a 是负数了。

分析:任何一个数 异或0 结果为其本身,与 -1 (二进制全为1) 相当于取反

一个32 bit的int类型的正数 >> 31,结果为0,负数 >> 31 为-1。

即 (a>>31)的结果为 0 或者 -1。如果 a 为负数,(a>>31)^a 相当于 ~a,则需要 + 1 才能得到 a 的绝对值

所以代码为:((a >> 31) ^ a) + (a >>> 31)

  • 记得 a 是以补码的方式进行计算的,负数的补码不等于原码,计算前先转换!

或:

int a = -86;
int b = a >> 31;// 当a为正时:b = 0,a ^ b = a;// 当a为负时:b = -1,a ^ b = ~a;return (a ^ b) - b;// 也可以写为:(a ^ (a >> 31)) - (a >> 31)

位运算概览与奇巧淫技相关推荐

  1. 算法很美第一章 位运算的奇巧淫技

    第一章 位运算的奇巧淫技 1.2 题解:如何找数组中唯一成对的那个数 知识点: A^A=0 A^0=A(一个数与0进行按位异或,结果是他自己) 对一个序列进行按位异或,可以消除掉序列中的重复项,比如: ...

  2. 蓝桥杯算法竞赛系列第一章——位运算的奇巧淫技及其实战

    遇见蓝桥遇见你,不负代码不负卿! 第二章"递归"已将更新咯,欢迎铁汁们点评!蓝桥杯算法竞赛系列第二章--深入理解重难点之递归(上)_安然无虞的博客-CSDN博客 目录 一.位运算符 ...

  3. iOS 开发的一些奇巧淫技

    iOS开发的一些奇巧淫技1&2 CGfloat和float的区别? 现在上架的app都要求支持64位系统,那么CGFloat和float的区别就在这里.command+左键点击CGFloat. ...

  4. 【奇巧淫技】python 助你每天早上八点自动发送天气预报邮件到QQ邮箱

    此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉. 补充 有不少杠精小婊贝留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!! ...

  5. iOS开发的一些奇巧淫技3

    CGfloat和float的区别? 现在上架的app都要求支持64位系统,那么CGFloat和float的区别就在这里.command+左键点击CGFloat. 1 typedef CGFLOAT_T ...

  6. Django REST framework的一些奇巧淫技(干货!!!)

    开始之前,假设你已经有Django和Django REST framework的一些基础了 mixins,ViewSet和routers配合使用 minxis的类有5种 CreateModelMixi ...

  7. iOS开发的一些奇巧淫技2

    能不能只用一个pan手势来代替UISwipegesture的各个方向? 1 - (void)pan:(UIPanGestureRecognizer *)sender 2 { 3 4 typedef N ...

  8. iOS 【奇巧淫技】获取webView内容高度

    针对获取webView高度问题之前写过一个方案--通过监听WebView的scrollView的变化来实时更新高度 附上链接: iOS[终极方案]精准获取webView内容高度,自适应高度 本文是给出 ...

  9. jane street market prediction 冠军方案 奇巧淫技与topline链接整理(3/3)

    目录 前言 将income 作为loss(优化目标) 读取数据,定义优化目标 模型训练与微调 提交结果 多目标学习 Topline整理 AE+MLP (rank10) Current 17th sol ...

最新文章

  1. MySQL InnoDB锁
  2. 多数据中心的高可用结构【环状星型数据库架构】
  3. java星际小战_首届中国星际战队联赛:TSG夺冠,小hero刘建宏大战惊天地泣鬼神...
  4. 每天一道LeetCode-----删除链表倒数第n个节点
  5. 标准SQL注入入侵语句
  6. mysql信息函数和加密函数_MYSQL 常用函数(数学、字符串、日期时间、系统信息、加密)...
  7. Silverlight 信息显示与编辑控件 示例
  8. python实现自动工作_python实现串口自动触发工作的示例
  9. 一起谈.NET技术,Microsoft NLayerApp案例理论与实践 - 多层架构与应用系统设计原则...
  10. jmeter录制脚本_jmeter(二)Badboy录制脚本
  11. 基于Android Studio游戏开发 飞机大战小游戏
  12. 2022年使用的最佳Javascript库
  13. 答题小程序 服务器,开源的基于云开发的在线答题小程序
  14. 小和尚打水问题_操作系统进程同步问题解析(哲学家问题、生产消费问题、小和尚打水问题等大量例子)...
  15. 多个同1div float left换行题
  16. win10截图相关教程
  17. 电脑经常出现程序未响应
  18. shell 编程arry数组
  19. Postgresql 12.2 + PostGIS 3.0.1 安装部署手册
  20. 【Nmap的使用方法】

热门文章

  1. git:‘ignore‘ 不是一个 git 命令。参见 ‘git --help‘。的解决办法
  2. android桌面快捷方式
  3. 弘辽科技:产品上架前应该如何合理去制定sku
  4. 微信小程序引入map组件并在地图上标点
  5. Spring——单例模式和多例模式
  6. 傅里叶变换--虚部的理解
  7. 人脸识别之表情识别(一)--传统方法概述
  8. DNS服务器未响应解决方案
  9. authentication is required,163 smtp12,EMCowAAXfwfWaTpdysD_Cg--.58754S2 1564109270
  10. IT售前工程师发展规划步骤