当前位置:首页 > 默认分类 > 正文内容

【算法】位运算与优化

virtualman6年前 (2018-08-15)默认分类2979

刚刚学算法的时候,看到dalao处处用位运算,感觉真的太玄学了,然后直到今天才深入理解了下位运算的操作,其实并没有多么玄学,只不过是利用了计算机本身的性质罢了。

基本概念:

真值:

带符号位的机器数对应的真正数值称为机器数的真值
0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1

原码:

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值
PS:正数的原、反、补码都一样:0的原码跟反码都有两个,因为这里0被分为+0和-0。

反码:

正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反

补码:

正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补

PS:0的补码是唯一的,如果机器字长为8那么[0]补=00000000。

移码:

移码最简单了,不管正负数,只要将其补码的符号位取反即可。

例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]补=11010101,[X]移=01010101

位运算基本运算符:

&:按位与
|:按位或
^:按位异或(相同为1,不同为0)
~:取反
<<:左移
>>:右移

常用位运算优化方法:

1.判断整数奇(1)偶(0)性:

bool IsOdd(int x)//判断是否为奇数{    return x&1;
}

 

2.乘以或除以2的幂:

 

列如:    乘以2: x<<1;
     乘以2的n次方:x<<n;
     除以2:x>>2;
     除以2的n次方:x>>n;
变式:    计算2的n次方:2<<(n-1);

 

3.比较两个数是否相等:

计算两个数的异或值,若等于0,则两数相等。

bool IsEqual(int a,int b)
{    return !(a^b);
}

 

4.不使用第三方变量交换a,b:

int a,int b;
a=a^=a^=a^b;

 

5.判断两个数是否同号:

!((a^b)>>31);

 

6.求n的绝对值:

(n^(n>>31))-(n>>31);

 

7.提取lowbit():

int lowbit(int x)
{    return x&-x;
}

 

8.计算整数x和y的平均值,可防止溢出。

int average(int x, int y) //返回X,Y 的平均值 { 
  return (x&y)+((x^y)>>1); 
}

 

9.判断一个整数n是否为2的幂 2^n:

((x&(x-1))==0)&&(x!=0);


相关文章

【NOIP初赛 】哈夫曼树

【NOIP初赛 】哈夫曼树

根据我已刷的初赛题中基本每套的倒数第五或第六个不定项选择题就有一个关于哈夫曼树及其各种应用的题,占:0—1.5分;然而我针对这个类型的题也多次不会做,so,今晚好好研究下哈夫曼树;  概念:  给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二...

【Socket通信】关于Socket通信原理解析及python实现

【Socket通信】关于Socket通信原理解析及python实现

Socket(套接字)通信{网络通信其实就是Socket间的通信},首先了解下概念:【来源于百度百科】1"两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。"可以这么说,Socket就是一个网络编程的接口(API),它定义了一种标准,并对TCP/I...

Python中的selenium库的基本用法

Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。通过此行代码可以快速在Python中安装selenium库pip install Selenium另外,我们仍需要安装浏览器驱动...

【疑难杂症】记录一次定位并修复涉及支付、转账的系统性BUG

【疑难杂症】记录一次定位并修复涉及支付、转账的系统性BUG

在某个线上的项目上,突然收到用户反馈,存在转账连续转两次的情况。一开始接到反款后并没有太在意,因为这个项目已经在线上稳定运行了近两年的时间,期间也并没有对订单或者支付系统进行修改。支付的接口也没有发生变化,因此,第一次反馈认为是一次用户的误报。但是,今天下午,有个开发者用户给我再一次反馈了这个BUG...

跑在内存中的数据库——H2数据库

跑在内存中的数据库——H2数据库

今天接触到了一个非常有意思的数据库,叫H2数据库。在众多数据库中,H2数据库以其独特的特性——内存数据库模式,吸引了大量开发者的关注。今天,就来深入探讨一下这个跑在内存中的数据库——H2数据库。 一、H2数据库简介 H2是一个轻量级的关系型数据库,它支持嵌入式和客户...

记录一次如何自己使用国外服务器搭建梯子

记录一次如何自己使用国外服务器搭建梯子

机缘巧合之下,租了一台亚马逊的美国服务器,想着这么大的服务器不能就跑一个业务吧,得利用起来,于是,就开始了搭建梯子之旅。 第一步:使用root账号登上ssh服务器。 第二步:执行一键搭建脚本: bash <(wget -qO- -o- https://git.io/v2ray.sh)...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。