位运算

数字用二进制表示后的运算

无论是有符号,无符号还是其他各种类型的数。它们之间的转换的基石就是二进制的表达式没有发生改变,变得只是转换的表达式。

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)的更多相关文章

  1. Java I/O : Bit Operation 位运算

    Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter   ...

  2. CodeForces 282C(位运算)

    C. XOR and OR time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  3. uva 10718 Bit Mask (位运算)

    uva 10718  Bit Mask  (位运算) Problem A Bit Mask Time Limit 1 Second In bit-wise expression, mask is a ...

  4. A Corrupt Mayor's Performance Art(线段树区间更新+位运算,颜色段种类)

    A Corrupt Mayor's Performance Art Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100 ...

  5. POJ 2777 Count Color(线段树+位运算)

    题目链接:http://poj.org/problem?id=2777 Description Chosen Problem Solving and Program design as an opti ...

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

  7. Codeforces 868D Huge Strings - 位运算 - 暴力

    You are given n strings s1, s2, ..., sn consisting of characters 0 and 1. m operations are performed ...

  8. HUST 1605 Gene recombination(广搜,位运算)

    题目描述 As a gene engineer of a gene engineering project, Enigma encountered a puzzle about gene recomb ...

  9. poj 2777 Count Color - 线段树 - 位运算优化

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42472   Accepted: 12850 Description Cho ...

随机推荐

  1. 真千兆路由的极限之OPENWRT MAKE, 某品牌白菜价QCA9558/QCA9880/QCA8337N纯种组合OS搭建时记

    自从上次仙人梦里放了一张无字天书,解惑了WPR003N的秘诀后,渐渐的,就忘了这件这事情,连想好的评测都拖延了好多月了,毕竟路由是拿来用的,不是用来写什么陈词滥调的评测的,无意间,热爱白菜的我发现了一 ...

  2. 传输层的TCP和UDP协议

    作者:HerryLo 原文永久链接: https://github.com/AttemptWeb... TCP/IP协议, 你一定常常听到,其中TCP(Transmission Control Pro ...

  3. 最全面的改造Zuul网关为Spring Cloud Gateway(包含Zuul核心实现和Spring Cloud Gateway核心实现)

    前言: 最近开发了Zuul网关的实现和Spring Cloud Gateway实现,对比Spring Cloud Gateway发现后者性能好支持场景也丰富.在高并发或者复杂的分布式下,后者限流和自定 ...

  4. vue在窗口大小改变时强制刷新组件的方法

    mounted () { window.onresize = () => { return (() => { this.$forceUpdate(); })() } }

  5. 【网站公告】.NET Core 版博客站点第二次发布尝试

    在上次发布失败后,很多朋友建议我们改用 k8s ,但我们还是想再试试 docker swarm ,实在不行再改用 k8s . 在改进了 docker swarm 集群的部署后,我们准备今天 17:30 ...

  6. Java学习多线程第一天

    内容介绍 Thread 线程创建 线程池 线程状态图 1 多线程 1.1     多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序 ...

  7. coursera课程《how to learning 怎么学习》 总结

    总体来说,学完课程没有茅舍顿开的感觉,而是更加印证了之前的那个认知:大道至简,践则无敌,很多的学习方法上学的时候老师都教过我们,关键是我们能否坚持执行.课程讲了很多脑科学有关学习的知识,但对于我们实践 ...

  8. jQuery学习和知识点总结归纳

    jQuery目前在Web前端开发所占的比重越来越高,在我们jQuery学习和开发的过程中都会去使用.jQuery帮我们解决了浏览器之间JS一些不兼容的地方和简化了原生JS对DOM的操作.下面把PHP程 ...

  9. Sql Or NoSql,看完这一篇你就懂了

    前言 你是否在为系统的数据库来一波大流量就几乎打满CPU,日常CPU居高不下烦恼?你是否在各种NoSql间纠结不定,到底该选用那种最好?今天的你就是昨天的我,这也是写这篇文章的初衷. 这篇文章是我好几 ...

  10. C++学习想法

    今天是周一,今天做早操的时候舍友说准备买一本C++基础的书.我觉得这样的想法很好,突然想到自己最近几天因为自己私人原因事情很忙,蛋这不能成为我不学C++的理由.所以我在这规划了我这一周的学习进程.首先 ...