学会位运算,助力开发高性能

手撕位运算

0x00 -- 位运算概览

符号 描述 运算规则
& 按位与, 2个位都为1,结果为1
按位或, 一个位为1,结果为1
^ 按位异或, 相同为0,相异为1
~ 按位取反, 1变0,0变1
<<n 左移 各二进位全部左移n位,高位丢弃,低位补0
>>n 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

0x01 -- 按位与 &

运算规则:0&0=0 0&1=0 1&1=1

俩位相同为1,否则为0

3&5 = 1
3 0000 0011
5 0000 0101
& 0000 0001
用途
  • 清零

如果想将一个单元清0,即让这个数的各个位都为0,就让这个数去与一个各位都为0的数值按位与。结果为0

  • 取一个数的指定位

举个🌰:

a = 1010 1110, 取a的低四位。只需要找一个b,把b的低四位设置为1,其余为0,即

b= 0000 1111 .

&= 0000 1110. 就可以得到a的指定部分, 这个过程中b也就是a的(mask)所谓的掩码。

  • 判断奇偶

只要根据末尾是0还是1来判断是否是奇偶数。

是0就是偶数,是1就是奇数。因此可以代替if (a % 2) == 0

替换为if(a&1==0)来判断a是否为偶数。

0x02 -- 按位与 |

运算规则:0|0=0 0|1=1 1|1=1

只要其中一位是1, 结果就位1.

3|5 = 7
3 0000 0011
5 0000 0101
| 0000 0111
用途
  • 用来对一个数据的某些位设置位1

举个🌰:

a = 1010 1110, 设置a的低四位为1。只需要找一个b,把b的低四位设置为1,其余为0,即

b= 0000 1111 .

|= 1010 1111. 就可以得到按位与后的结果,

0x03 -- 按位异或 ^

运算规则:0^0=0 0^1=1 1^0=1 1^1=0

参加元算的俩个数,相同的位为0,不同的位为1;

异或的几条性质:

  1. 交换律

  2. 结合律 (ab)c == a(bc)

  3. 对于任何数x,都有 xx=0,x0=x

  4. 自反性: abb=a^0=a;

用途
  • 翻转指定位

    举个🌰:

    a = 1010 1110, 翻转a的低四位。只需要找一个b,把b的低四位设置为1,其余为0,即

    b= 0000 1111 .

    ^= 1010 0001. 就可以得到按位异或后的结果。 就把a的低四位按位翻转了。

  • 与0相异或值不变

     1010 1110
     0000 0000
    ^1010 1110
       a 3 0000 0011
       b 4 0000 0100
       a^b 0000 0111 a
       
       b 4 0000 0100
       b^a 0000 0111 a
               0000 0011 b
    
  • 交换俩个数

    void swap(int a, int b) {
      if(a!=b) {
        a^=b;
        b^=a;
        a^=b;
      }
    }
    

0x05 -- 按位取反 ~

运算规则: ~1=0 ~0=1

使a的最低位为0,可以表示为:a & ~1。~1的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0。因为“ ~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。

0x06 -- 左移运算符 <<

使a的最低位为0,可以表示为:a & ~1。~1的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0。因为“ ~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。

0x07 -- 右移运算符 >>

定义:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。

操作数每右移一位,相当于该数除以2。

综合应用

比如有两个int类型变量x、y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围,所以位运算就派上用场啦。

(x&y)+((x^y)>>1);


对于一个大于0的整数,判断它是不是2的几次方

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


求绝对值

int abs( int x ) { 
   int y ; 
   y = x >> 31 ; 
   return (x^y)-y ;        //or: (x+y)^y 
}

取模运算,采用位运算实现:

a % (2^n) 等价于 a & (2^n - 1)


乘法运算 采用位运算实现

a * (2^n) 等价于 a << n


除法运算转化成位运算

a / (2^n) 等价于 a>> n


求相反数

(~x+1)


a % 2 等价于 a & 1

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,362评论 6 537
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,013评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,346评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,421评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,146评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,534评论 1 325
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,585评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,767评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,318评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,074评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,258评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,828评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,486评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,916评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,156评论 1 290
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,993评论 3 395
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,234评论 2 375

推荐阅读更多精彩内容

  • 文集:iOS 知识补充[//www.greatytc.com/c/1422baa6495c] 前言 这篇...
    欧德尔丶胡阅读 1,171评论 0 2
  • 本人非科班出身,但由于想从事这一行业,希望进阶到更高的境界,可是面试了几次发现没有一些基础确实是有些难以支撑自己,...
    Su_yj阅读 561评论 0 0
  • Objective-C语言中有各种各样的运算符可处理数字中的特定位,如下表所示: 符号运算 & 按位与| 按位...
    笙笙哥阅读 686评论 0 0
  • 按位与运算符(&) 参加运算的两个数据,按二进制位进行“与”运算。 运算规则:0&0=0; 0&1=0; 1&0=...
    等一夏_81f7阅读 2,005评论 0 0
  • Ps:位运算符是指进行二进制的运算。C语言中提供的位运算包括,与(&)、或(|)、异或(^)、取反(~)、移动(“...
    邓胖胖2号阅读 2,016评论 0 0