zoukankan      html  css  js  c++  java
  • L19_11 位运算实例

    题目:
    位运算实例,已知一个正整数变量(a),对这个数的二进制数列进行下面的操作,依次使用位运算符号写出操作方式:

    1)将最后一位的右边加上一个(1),例如(101)变为(1011)

    答:将(101)左移一位,然后加(1),就是((a<<1)+1)

    2)将最后一位变为(0),例如(1010)或者(1011)处理后都变成(1010)

    答:
    方法一:最后一位直接变成(0) 不太好办,可以直接变成(1),然后再想办法减去(1)就行了:构造一个数字(1),然后用(a)(1)进行按位取,就把最后一位变成了1,其它各位保留原来的样子:((a|1)-1)

    方法二:构造一个前面都是(1),最后一位是(0)的家伙,然后与原来的数字进行与运算,就可以把最后一位变成(0),其它各位不变。那么,什么数字是前面都是1,最后一位是0呢?这就需要单独记忆一下了:(-2)的二进制表示就是前面都是1,最后一位是0.
    原因:
    原码 0010
    反码 1101
    补码 1110

    3)取末5位序列,例如(1101 1010)处理后得到(11010)

    答:构造一个右边5个是1,左边都是0的数,然后两者相与。就是 000...00 11111,而这个前面都是0,后5个是1的数字,就是$ (1<<5)-1$ ,所以表达式:(n& ((1<<5)-1))

    4)去掉序列中最右边的1的左边所有数字,例如1101 1000 取到右边的1000

    答:就是保留最右边的那个1,这是位运算的经典方法:(a & (-a))

  • 相关阅读:
    Java日志体系(1) —— 那些年那些事,那些日志的历史
    直播工作原理
    【PAT乙级 】1003. 我要通过!
    [牛客网刷题]被3整除
    [牛客网刷题]牛牛找工作
    Mybatis的简单分析
    数位DP
    正则表达式
    能量球
    从此,我们相伴,不离不弃
  • 原文地址:https://www.cnblogs.com/littlehb/p/15160258.html
Copyright © 2011-2022 走看看