zoukankan      html  css  js  c++  java
  • 位运算知识

    位运算基本知识

    符号 描述 运算规则
    & 两个位都为1时,结果才为1
    | 两个位都为0时,结果才为0
    ^ 异或 两个位相同为0,相异为1
    ~ 取反 0变1,1变0
    << 左移

    各二进位全部左移若干位,高位丢弃,低位补0

    >> 右移

    各二进位全部右移若干位,对无符号数,高位补0,

    有符号数,各编译器处理方法不一样,有的补符号位

    (算术右移),有的补0(逻辑右移)


    >>>
    无符号右移

    各二进位全部右移若干位,高位补0,低位丢弃

     1、<< 左移
    两个左尖括号表示左移运算符,运算符规则是:各二进位全部左移若干位,高位丢弃,低位补0。 

    例如:6 << 2 = 24
     
    0000 0000 0000 0000 0000 0000 0000 0110     -> 6
    0000 0000 0000 0000 0000 0000 0001 1000     -> 6 << 2 = 24

    我们将6的二进位向左移动两位,低位补上两个0,高位丢弃,得出来的结果就是24。

    左移常被用来做 * (2 ^ n)的运算,因为直接基于二进制运算,所以左移效率比 * (2 ^ n)高。

    2、>> 右移
    两个右尖括号表示右移运算符,运算符规则是:各二进位全部右移若干位,正数高位补0,负数高位补1,低位丢弃。

    例如: 12 >> 2 = 3
     
    0000 0000 0000 0000 0000 0000 0000 1100     -> 12
    0000 0000 0000 0000 0000 0000 0000 0011     -> 12 >> 2 = 3

    因为12是正数,右移过程中高位补上两个0,低位丢弃,得出来的结果就是3。
    例如:-12 >> 2 = -3

    1111 1111 1111 1111 1111 1111 1111 0100    -> -12
    1111 1111 1111 1111 1111 1111 1111 1101    -> -12 >> 2 = -3

    因为-12是负数,右移过程中高位补上两个1,低位丢弃,得出来的结果就是-3。
    右移常被用来做 / (2 ^ n)的运算,因为直接基于二进制运算,所以右移效率比 / (2 ^ n)高。

    3、>>> 无符号右移
    三个右尖括号表示无符号右移运算符,运算符规则是:各二进位全部右移若干位,高位补0,低位丢弃。

    例如: 12 >>> 2 = 3
     
    0000 0000 0000 0000 0000 0000 0000 1100     -> 12
    0000 0000 0000 0000 0000 0000 0000 0011     -> 12 >>> 2 = 3

    我们将12的二进位向右移动两位,高位补上两个0,低位丢弃,得出来的结果就是3。

    例如:-12 >>> 2 = 1073741821
     
    1111 1111 1111 1111 1111 1111 1111 0100    -> -12
    0011 1111 1111 1111 1111 1111 1111 1101    -> -12 >> 2 = 1073741821

    我们将-12的二进位向右移动两位,高位补上两个0,低位丢弃,得出来的结果就是1073741821。

     位运算的常见技巧

    位运算实现乘法:数 a 向右移一位,相当于将 a 除以 2;数 a 向左移一位,相当于将 a 乘以 2
    位运算判断奇偶数:只要根据数的最后一位是 0 还是 1 来决定即可,为 0 就是偶数,为 1 就是奇数。
    用于交换两个数:a ^ b ^ b = a
    n&(n-1):相当于把n最右边的1变成0,其余不变

    位运算实际运用的例子:

    位交换两个数:a ^ b ^ b = a

    268. 丢失的数字

    参考:剑指offer二刷【位运算】【java】【图解】

               关于位运算的所有基础知识和 实际应用总结

       位运算——强大得令人害怕

       位运算常用技巧总结

       为什么程序员必须懂点位运算

  • 相关阅读:
    【hihocoder 1477】闰秒
    【codeforces 768F】Barrels and boxes
    【codeforces 767E】Change-free
    【codeforces 810A】Straight «A»
    【codeforces 810B】Summer sell-off
    【codeforces 810C】Do you want a date?
    【codeforces 757E】Bash Plays with Functions
    【codeforces 749D】Leaving Auction
    Java数据结构与算法(5)
    使用Xshell远程连接管理Linux实践
  • 原文地址:https://www.cnblogs.com/yangms/p/14342522.html
Copyright © 2011-2022 走看看