位运算总结(Bit Operation)
位运算
数字用二进制表示后的运算
无论是有符号,无符号还是其他各种类型的数。它们之间的转换的基石就是二进制的表达式没有发生改变,变得只是转换的表达式。
1.简单的布尔运算 Boolean algebra
与&,或|,非~,异或^
与& | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
或 | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
非 ~ | |
---|---|
0 | 1 |
1 | 0 |
异或 ^ | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
2.逻辑运算 logical operation
逻辑运算符 &&,||,!
记住这写运算只返回 ture or false ,也就是返回 0,1
例子 | 运算结果 |
---|---|
!0x41 | 0x00 |
!0x00 | 0x01 |
0x69&&0x55 | 0x01 |
还有一个重要的性质
就是当第一个参数可以评估整个表达式的时候,这个时候结束返回,不需要再去评估第二个参数了
3.移位运算 shift operation
左移,left shift operation
右移,right shift operation :
- 逻辑右移:直接进行移动填充0
- 算术右移:填补most significant value ,也就是填充符号位
00001010>>2=00000010
10001010>>3=11110001
4.还需要注意的知识点
特别提醒:
- 无符号数和有符号数之间的转换,或者是运算。要非常小心overflow
- 可以使用移位运算来代替除法,移位运算的效率更高
- 再就是一些需要积累的小技巧,例如 n&(n-1) 进行循环可以求出 n二进制表达式中的"1"的个数。
位运算的应用
剑指offer 面试题65:不用加减乘除做加法
分析的思路(三步走):
十进制分析 7+15
- 第一步:各位进行相加(不进位) 5+7=2,0+1=1 结果为12
- 第二步:做进位,5+7的进位值10
- 第三步:累加前面的结果 12+10=22
二进制的分析 5(101)+17(10001)
- 第一步: 各位进行相加,不进位
^ | 异或 | |||
---|---|---|---|---|
1 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | ||
1 | 0 | 1 | 0 | 0 |
- 第二步:做进位 与运算后,继续左移一个单位 才是进位值(iteration)
& | 与 | |||
---|---|---|---|---|
1 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | ||
0 | 0 | 0 | 0 | 1 |
- 第三步: 累加前面两步的结果 (可能需要继续进位)
10100+(00001<<1)00010=10110 在运算过程中无进位
代码实现
#include <cstdio>
int Add(int num1, int num2)
{
int sum, carry;
do {
sum = num1 ^ num2;
carry = (num1 & num2) << 1; // until carry=0 return sum(num1)
num1 = sum;
num2 = carry;
}
while(num2 != 0);
return num1;
}
一些相关问题
交换两个变量的值(不使用中间变量temporary)
当然在python中可以直接进行交换,这个是语言的语法
a,b=b,a # 可以直接实现元素之间的交换
基于加减法
int a,b;
a=a+b;
b=a-b; // b=((a+b)-b)=a
a=a-b; // a=((a+b)-a)=b
基于异或运算
a=a^b;
b=a^b; //b= (a^b)^b=a
a=a^b; //a= (a^b)^a=b
位运算总结(Bit Operation)的更多相关文章
- Java I/O : Bit Operation 位运算
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- CodeForces 282C(位运算)
C. XOR and OR time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- uva 10718 Bit Mask (位运算)
uva 10718 Bit Mask (位运算) Problem A Bit Mask Time Limit 1 Second In bit-wise expression, mask is a ...
- A Corrupt Mayor's Performance Art(线段树区间更新+位运算,颜色段种类)
A Corrupt Mayor's Performance Art Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100 ...
- POJ 2777 Count Color(线段树+位运算)
题目链接:http://poj.org/problem?id=2777 Description Chosen Problem Solving and Program design as an opti ...
- A - Subarrays Beauty gym 位运算 &
You are given an array a consisting of n integers. A subarray (l, r) from array a is defined as non- ...
- Codeforces 868D Huge Strings - 位运算 - 暴力
You are given n strings s1, s2, ..., sn consisting of characters 0 and 1. m operations are performed ...
- HUST 1605 Gene recombination(广搜,位运算)
题目描述 As a gene engineer of a gene engineering project, Enigma encountered a puzzle about gene recomb ...
- poj 2777 Count Color - 线段树 - 位运算优化
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42472 Accepted: 12850 Description Cho ...
随机推荐
- Anaconda大法好,为什么要用Anaconda(附linux安装与用例)
距离写上一个博客已经过去很久了,注册的时候我还是个大三学生抱着windows系统的visual studio在OPENCV等等复杂组件下面瑟瑟发抖,一不小心就担心hpp找不到了,依赖库没了,或者安装了 ...
- vue3.0中的双向数据绑定方法
熟悉vue的人都知道在vue2.x之前都是使用object.defineProperty来实现双向数据绑定的 而在vue3.0中这个方法被取代了 1. 为什么要替换Object.definePrope ...
- java基础学习_io流之FileInputStream
一.FileInputStream属性: /* File Descriptor - handle to the open file */private final FileDescriptor fd; ...
- 夯实Java基础(十一)——内部类
1.内部类的概念 内部类顾名思义:将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.对于很多Java初学者来说,内部类学起来真的是一头雾水,根本理解不清楚是个什么东西,包括我自己(我太菜 ...
- Selenium+java - 借助autolt完成上传文件操作
写在前面: 上传文件是每个自动化测试同学会遇到,而且可以说是面试必考的问题,标准控件我们一般用sendkeys()就能完成上传,但是我们的测试网站的上传控件一般为自己封装的,用传统的上传已经不好用了, ...
- eclipse导入码云-GIT项目
1.首先找到项目源码地址我随便找到一个git地址 :https://gitee.com/mingSoft/MCMS 2.打开eclipse空白处右键导入项目搜索git. 3.将第一步复制的git地址复 ...
- indexedDB添加,删除,获取,修改
[toc] 在chrome(版本 70.0.3538.110)测试正常 编写涉及:css, html, js 在线演示codepen html代码 <h1>indexedDB</h1 ...
- Nginx 1.15.5: 405 Not Allowed
0x00 事件 在做一个业务跳转时,遇到这个错误 405 Not Allowed,找了挺多资料,多数解决方案是让在 nginx 配置文件中直接添加 error_page 405 =200 $uri; ...
- 深入剖析PHP7内核源码(一)- PHP架构与生命周期
PHP7 为什么这么快? 全新的zval 更节约的空间,栈上分配内存 zend_string 存储字符串的Hash值,数组查询的时候不需要进行Hash计算 在HashTable桶内直接存数据,减少了内 ...
- C# 复制Excel单元格格式
本文将介绍通过C# 复制Excel单元格格式的方法,包括复制单元格中的字体.字号.字体加粗.倾斜.单元格背景色.字体颜色.单元格数字格式.单元格文字方向.文字旋转.下划线.单元格对齐方式.单元格边框等 ...