zoukankan      html  css  js  c++  java
  • c/c++学习笔记(3)

      这次的章节主要是对于按位运算符的掌握,如:~、&、|、>>、<<,看到这几个运算符,让我想起了以前突然有一次在网上看到一个算法(C#)写的,里面就有很多这样的按位运算符,当时我就懵了,于是便到网上找资料,当时用具体的按位运算符去搜索,没找到什么资料,后来就发了博文,记录了自己一些理解,现在回想起来,终于把这几个问题搞明白了,呵呵。

      由于刚刚掌握没多久,怕自己隔段时间就会生疏,于是拿一道练习题来做解析,以后自己再来看便能更好的熟悉起来。

      例题:将x中从第p位开始的n个(二进制)位设置为y中最右边的n位的值。

      实现:  

    View Code
    1 unsigned setbits(unsigned x, int p, int n, unsigned y)
    2 {
    3     return (x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n))))) | ((y & ~(~0 << n)) << (p + 1 - n));
    4 }

      解析:

        1、~0 << (p + 1) 

          ~0将0的二进制位进行反转,也就是无限个1,然后向左移动p+1位,如图:

          

        2、~(~0 << (p + 1 - n))

          将0反转,然后向左移动p+1-n位,然后反转,如图:

          

        3、(~0 << (p + 1) | (~(~0 << (p + 1 - n)))

          将1和2中的结果进行按|取值,结果如图:

          

        4、x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n))))

          将x的值跟前面3步的结果进行按|取值,结果会变成x从p开始的n个位的二进制值为0,其他值不变,如图:

          

        5、 ~(~0 << n)

          经过上述分析,这个表达式的值就显而易见了,结尾为n个1,其余位数为0,如图:

          

        6、y & ~(~0 << n)

          将y与第五步进行按&取值,其结果为保留y最右边n位真实值,其他位都为0,如图:

          

        7、(y & ~(~0 << n)) << (p + 1 - n)

          将第6步的结果向左移动p+1-n位,也就是在最右边添加p+1-n位0,如图:

          

        8、(x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n))))) | ((y & ~(~0 << n)) << (p + 1 - n))

          最后的表达式则是将左右两边最后的值,进行按|取值,得出最后的结果,如图:      

          

  • 相关阅读:
    window下安装QT出错解决方案
    wiin10下VS2015+opencv3.4.0-extra_modules+CMake配置
    可重入、线程安全辨析与场景举例
    WPF仿网易云音乐系列(三、播放进度条+控制按钮)
    WPF仿网易云音乐系列(二、歌单创建窗口+登录设置模块)
    WPF仿网易云音乐系列(一、左侧菜单栏:Expander+RadioButton)
    WPF仿网易云音乐系列(序)
    C# WPF仿360安全卫士11
    crontab的语法规则格式(每分钟、每小时、每天、每周、每月、每年定时执行 规则)
    Pymysql 连接 Mysql 数据库及增删改查操作
  • 原文地址:https://www.cnblogs.com/ahl5esoft/p/2519202.html
Copyright © 2011-2022 走看看