位运算

作者: 柠檬草YF | 来源:发表于2019-08-09 15:41 被阅读2次

    先简单看一下概念喽

    1、补码

    已知:十进制正整数转换为二进制数,通过除2取余的方法可得到?
    
    问:一个十进制的负整数转换为二进制数,怎么做?
    
    答:这就用到了补码的概念,其实负数是以补码的形式表示,其转换方式简单的一句话就是:先按正数转换,然后取反加1。
    

    例子哟

    要将十进制的-10用二进制表示,先将10用二进制表示:
    0000 0000 0000 1010
    取反:
    1111 1111 1111 0101
    加1:
    1111 1111 1111 0110
    所以,-10的二进制表示就是:1111 1111 1111 0110
    

    2、按位与(&)

    参加运算的两个数,换算为二进制(0、1)后,进行与运算。只有当相应位上的数都是1时,该位才取1,否则为0。
    
    将10与-10进行按位与(&)运算:
    0000 0000 0000 1010
    1111 1111 1111 0110
    -----------------------
    0000 0000 0000 0010
    所以:10 & -10 = 0000 0000 0000 0010
    

    3、按位或(|)

    参加运算的两个数,换算为二进制(0、1)后,进行或运算。只要相应位上存在1,那么该位就取1,均不为1,即为0。
    
    将10与-10进行按位或(|)运算:
    0000 0000 0000 1010
    1111 1111 1111 0110
    -----------------------
    1111 1111 1111 1110
    所以:10 | -10 = 1111 1111 1111 1110
    

    4、按位异或(^)

       参加运算的两个数,换算为二进制(0、1)后,进行异或运算。只有当相应位上的数字不相同时,该为才取1,若相同,即为0
    
    将10与-10进行按位异或(^)运算:
    0000 0000 0000 1010
    1111 1111 1111 0110
    -----------------------
    1111 1111 1111 1100
    所以:10 ^ -10 = 1111 1111 1111 1100
    

    5、取反(~)

    参加运算的两个数,换算为二进制(0、1)后,进行取反运算。每个位上都取相反值,1变成0,0变成1。
    
    对10进行取反(~)运算:
    0000 0000 0000 1010
    ---------------------
    1111 1111 1111 0101
    所以:~10 = 1111 1111 1111 0101
    

    6、左移(<<)

    参加运算的两个数,换算为二进制(0、1)后,进行左移运算,用来将一个数各二进制位全部向左移动若干位。
    
    对10左移2位(就相当于在右边加2个0):
    0000 0000 0000 1010
    --------------------
    0000 0000 0010 1000
    所以:10 << 2 = 0000 0000 0010 1000 = 40
    

    7、右移(>>)

    参加运算的两个数,换算为二进制(0、1)后,进行右移运算,用来将一个数各二进制位全部向右移动若干位。
    
    对10右移2位(就相当于在左边加2个0):
    0000 0000 0000 1010
    --------------------
    0000 0000 0000 0010
    所以:10 >> 2 = 0000 0000 0000 0010 = 2
    

    小结:
    一个数组里都是两两一对的数字,只有一个数字是单独不成对的,怎么找出来呢
    要求 时间复杂度 O(n),空间复杂度O(1)
    ??????
    有想法的同学,在评论里留言哟!

    相关文章

      网友评论

        本文标题:位运算

        本文链接:https://www.haomeiwen.com/subject/xcdxjctx.html