您的位置:首页 > 编程语言 > C语言/C++

C语言之位运算

2016-06-22 22:54 253 查看
位运算只适用于整数与字符,不可以用在浮点数上

反、与、或、异或运算符不关心操作数的符号。

与 & 

    遇0得0,非0得1

或 |

    遇1得1,非1得0

非 !

    !(表达式)

    表达式的值 为0

    则 

    !(表达式)==1

    表达式的值 不为0

    !(表达式)==0

异或 ^

    单1得1,双1得0,双0得0

    异或用来做翻转非常好。

     int a=20,b=5;

     $a = $a ^ $b;

     $b = $a ^ $b;

     $a = $a ^ $b;

取反

    0变成1,1变成0

    unsigned char a = ~1;

    0000 0001

    1111 1110

    a=254

左移 <<    右移 >>

    左移等于乘以2

    右移等于整除2

    左位移右边都是填充0

    右位移正数左边填充0,负数左边填充1

题:

    unsigned char ch1 = 4;

    char ch2 = -3;

    char chor = ch1 | ch2;

     4 0000 0100

    -3 1111 1101

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

       1111 1101

       chor = -3

    char chand = ch1 & ch2;

     4 0000 0100

    -3 1111 1101

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

       0000 0100  4

       chand = 4

    char chno = ~ch2;

    -3 1111 1101

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

       0000 0010 2

       chno = 2

    char ch = ch1 ^ ch2

     4 0000 0100

    -3 1111 1101

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

       1111 1001 -7

       ch = -7

计算二进制数中有几个1:

    num = 100;

    int wei1(int num){

        return num ? 1 + wei1(num & (num - 1)) : 0;

    }

    wei1(num);

取反运算符的高级用法:

    1.进行某些操作,需要特定的数据,如果与位数有关,可以借助取反

        例: 清楚末尾的0    num & ~1

    2.求被4整除的余数是多少, 不可以用%. 通常用在结构体对其,便于内存查找。

        例: 73%4 = 73 - (73 & ~3);

题:

位运算做加法:

    int add(int a, int b) {

        int wei=0, jinwei=0;

        do{

            wei = a^b; //位

            jinwei = (a&b)<<1 //进位

            a = wei;

            b = jinwei;

        }while(b != 0) //加0就取消操作

        return a;

    }

打印整数的2进制数:

    void to2(int num, char data[33])

    {

        unsigned int n = 1 <<31;

        for(int i = 0; i < 32; i++)

        {

            data[i] = num & n ? '1' : '0';

            num <<= 1;

        }

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  位运算 c语言