位运算概览与奇巧淫技
文章目录
- 一、位运算概述
- 二、位运算概览
- 异或
- 二进制数的原码、反码、补码
- 左移 <<
- 右移 >>
- 无符号右移 >>>
- 三、位运算的使用奇巧淫技
- 判断奇偶数
- 获取二进制位是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
性质:
- 交换律 可任意交换运算因子的位置,结果不变
- 结合律 (即(ab)c==a(bc))
- 对于任何数x,都有xx=0,x0=x,同自己求异或为0,同0求异或为自己
- 自反性 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.2 题解:如何找数组中唯一成对的那个数 知识点: A^A=0 A^0=A(一个数与0进行按位异或,结果是他自己) 对一个序列进行按位异或,可以消除掉序列中的重复项,比如: ...
- 蓝桥杯算法竞赛系列第一章——位运算的奇巧淫技及其实战
遇见蓝桥遇见你,不负代码不负卿! 第二章"递归"已将更新咯,欢迎铁汁们点评!蓝桥杯算法竞赛系列第二章--深入理解重难点之递归(上)_安然无虞的博客-CSDN博客 目录 一.位运算符 ...
- iOS 开发的一些奇巧淫技
iOS开发的一些奇巧淫技1&2 CGfloat和float的区别? 现在上架的app都要求支持64位系统,那么CGFloat和float的区别就在这里.command+左键点击CGFloat. ...
- 【奇巧淫技】python 助你每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉. 补充 有不少杠精小婊贝留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!! ...
- iOS开发的一些奇巧淫技3
CGfloat和float的区别? 现在上架的app都要求支持64位系统,那么CGFloat和float的区别就在这里.command+左键点击CGFloat. 1 typedef CGFLOAT_T ...
- Django REST framework的一些奇巧淫技(干货!!!)
开始之前,假设你已经有Django和Django REST framework的一些基础了 mixins,ViewSet和routers配合使用 minxis的类有5种 CreateModelMixi ...
- iOS开发的一些奇巧淫技2
能不能只用一个pan手势来代替UISwipegesture的各个方向? 1 - (void)pan:(UIPanGestureRecognizer *)sender 2 { 3 4 typedef N ...
- iOS 【奇巧淫技】获取webView内容高度
针对获取webView高度问题之前写过一个方案--通过监听WebView的scrollView的变化来实时更新高度 附上链接: iOS[终极方案]精准获取webView内容高度,自适应高度 本文是给出 ...
- jane street market prediction 冠军方案 奇巧淫技与topline链接整理(3/3)
目录 前言 将income 作为loss(优化目标) 读取数据,定义优化目标 模型训练与微调 提交结果 多目标学习 Topline整理 AE+MLP (rank10) Current 17th sol ...
最新文章
- MySQL InnoDB锁
- 多数据中心的高可用结构【环状星型数据库架构】
- java星际小战_首届中国星际战队联赛:TSG夺冠,小hero刘建宏大战惊天地泣鬼神...
- 每天一道LeetCode-----删除链表倒数第n个节点
- 标准SQL注入入侵语句
- mysql信息函数和加密函数_MYSQL 常用函数(数学、字符串、日期时间、系统信息、加密)...
- Silverlight 信息显示与编辑控件 示例
- python实现自动工作_python实现串口自动触发工作的示例
- 一起谈.NET技术,Microsoft NLayerApp案例理论与实践 - 多层架构与应用系统设计原则...
- jmeter录制脚本_jmeter(二)Badboy录制脚本
- 基于Android Studio游戏开发 飞机大战小游戏
- 2022年使用的最佳Javascript库
- 答题小程序 服务器,开源的基于云开发的在线答题小程序
- 小和尚打水问题_操作系统进程同步问题解析(哲学家问题、生产消费问题、小和尚打水问题等大量例子)...
- 多个同1div float left换行题
- win10截图相关教程
- 电脑经常出现程序未响应
- shell 编程arry数组
- Postgresql 12.2 + PostGIS 3.0.1 安装部署手册
- 【Nmap的使用方法】
热门文章
- git:‘ignore‘ 不是一个 git 命令。参见 ‘git --help‘。的解决办法
- android桌面快捷方式
- 弘辽科技:产品上架前应该如何合理去制定sku
- 微信小程序引入map组件并在地图上标点
- Spring——单例模式和多例模式
- 傅里叶变换--虚部的理解
- 人脸识别之表情识别(一)--传统方法概述
- DNS服务器未响应解决方案
- authentication is required,163 smtp12,EMCowAAXfwfWaTpdysD_Cg--.58754S2 1564109270
- IT售前工程师发展规划步骤