zoukankan      html  css  js  c++  java
  • C语言位运算、移位运算 经典示例

    概述:

    C语言的位级运算可以运用到任何“整数”的数据类型上,如char、short、int、long、long long、或者unsigned这样的限定词。基本的位运算有与、或、非、异或等等。

    C语言的位移运算有两种:左移、右移:
    左移运算:x<<k 表示x向左移动k位,丢弃最高的k位,并在右端补k个0。
    右移运算:分逻辑右移 和 算术右移
                   逻辑右移:在左端补k个0
                   算术右移:在左端补k个最高有效位的值(它对有符号整数数据的运算非常有用)
    对于无符号数据(unsigned声明的整数对象),右移必须是逻辑的;
    对于有符号数据,几乎所有的编译器/机器组合都使用算术右移。

    经典示例:

    计算一个数的二进制表示中1的个数

    int countBinary1(unsigned int n)
    {
        int count=0;
        while(n)
        {
            //判断n的最低位是否为1,然后将n逻辑右移1位,直到n等于0
            if(n&1)
                count++;
            n=n>>1;
        }
        return count;
    }
    
    int countBinary1_2(int n)
    {
        int count=0;
        unsigned int flag=1;
        while(flag)
        {
            //从第1位到第32位,依次检测n的各位是否为1
            if(n&flag)
                count++;
            flag=flag<<1;
        }
        return count;
    }
    
    int countBinary1_3(unsigned int n)
    {
        int count=0;
        while(n)
        {
            n=n&(n-1);//将最低的值为1的位 置为0,其余位保持不变。直到将整个n变为0。例如,1100&1011=1000
            count++;
        }
        return count;
    }

    交换两个数(不借助第三变量)

    //对于任何a来说,a^a=0 , n^a^a=n
    void swapInt(int*a,int*b)
    {
        *a=*a^*b;
        *b=*a^*b;
        *a=*a^*b;
    }

    求一个数的绝对值

    //对于一个正整数n, n>>31等于0
    //对于一个负整数n, n>>31等于-1,-1的二进制表示为(111...11)各位都为1,(n^-1)+1即为n的绝对值。
    int absInt(int n)
    {
        //return (n^-1)+1;
        return(n^n>>31)-(n>>31);
    }

    将整数n的第k位设为1。(最低位为第1位)

    int setBinary1(int n,int k)
    {
        return n|1<<(k-1);
    }

    获得整数n的第k位的值。(最低位为第1位)

    int getBinary(int n, int k){
        return n>>(k-1)&1;
    }
  • 相关阅读:
    Study Plan The TwentySecond Day
    Study Plan The Nineteenth Day
    Study Plan The TwentySeventh Day
    Study Plan The Twentieth Day
    Study Plan The TwentyFirst Day
    python实现进程的三种方式及其区别
    yum makecache
    JSONPath 表达式的使用
    oracle执行cmd的实现方法
    php daodb插入、更新与删除数据
  • 原文地址:https://www.cnblogs.com/windlaughing/p/3178032.html
Copyright © 2011-2022 走看看