• 基础算法---位运算


    移位操作符

    求数n的二进制表示中第k位是几

    例如 10 的二进制表示是 1 0 1 0 ,右移3位 得到的是  1 ,  右移一位是 1 0 1 ,打印出来是 5 , 为了仅得到最后一位可以对 n>>k & 1,因为不管 n>>k是什么 & 1, 就会将 第二位以后的数都变为0 ,如果第一位是0就是0,是1则为1 (同时为1才为1,有0为0)

    下面的代码仅适用于 n小于16

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. int n;
    6. cin >> n;
    7. for (int k = 3; k >= 0 ; k-- )
    8. {
    9. printf("%d", n >> k & 1 );
    10. }
    11. return 0;
    12. }

    lowbit()函数

    lowbit(x) 返回x的最后一位1的位置

    例如 :

    x = 1 0 1 0 0 (二进制) 则返回 1 0 0 (二进制)

    x = 1 1 0 0 0 0 0 0 0 (二进制) 则返回 1 0 0 0 0 0 0 0 (二进制)

    函数是返回了 x & -x  (-x 是 ~x + 1 ) 取反x 加一

    如果 x 为:   10101010 ......  1000000000

    那么 -x就   01010101 ......  01111111111   +   1

    为:             01010101 ......  1000000000

    -------------------------------------------------------------------------

              10101010 ......  1000000000   x

              01010101 ......  1000000000   -x

    &--->  00000000 ......  1000000000 

    二进制中1的个数

    当我们有一个数10 ,他的二进制表示是 1010 ,那么10中有两个 1 ,该怎么求呢? 可以用上刚刚的lowbit函数,例如lowbit(10) 返回的是 10 (二进制) ,那么 1010 -10 就是 1000 ,lowbit(1000) 返回的是1000,1000-1000等于 0 ,定义一个变量记录就可以了

    1. #include <iostream>
    2. using namespace std;
    3. int lowbit(int n)
    4. {
    5. return n & ( - n ) ;
    6. }
    7. int main(void) {
    8. int n;
    9. cin >> n;
    10. int count = 0;
    11. while (n != 0)
    12. {
    13. count++;
    14. n -= lowbit(n);
    15. }
    16. printf("%d", count);
    17. }

     还有一种更为直接的方式,直接看第几位是什么 n >> k & 1就知道第 k+1 位是 0 还是 1 ,如果是 1 ,计数器加一

    1. #include <iostream>
    2. using namespace std;
    3. int main(void)
    4. {
    5. int n;
    6. cin >> n;
    7. int count = 0;
    8. for (int k = 0; k < 32; k++)
    9. {
    10. if ((n >> k & 1) == 1)
    11. {
    12. count++;
    13. }
    14. }
    15. printf("%d", count);
    16. return 0;
    17. }
  • 相关阅读:
    第四章-串
    【Java基础】方法重写、修饰符、权限修饰符及final、static关键字
    【Kafka】Golang中使用Kafka基于发布订阅模式实现消息队列
    react版本更新解决了那些问题
    Vue--》过滤器介绍及其使用方法
    TiDB与MySQL兼容性对比
    【操作系统】第三章 —— 如何管理物理内存
    如何快速搭建母婴行业的微信小程序?
    mulesoft MCIA 易错题汇总解析
    2022年湖北中级工程师职称可以评哪些专业?甘建二
  • 原文地址:https://blog.csdn.net/qq_66805048/article/details/132864939