C 【位运算符 & | ^ ~ << >>】

来源:互联网 发布:淘宝下载器 编辑:程序博客网 时间:2024/05/23 01:15
#include <stdio.h>int main(int argc, const char * argv[]) {        // 按位与    printf("2 & 9 = %i\n", 2 & 9); // 0    // 按位或    printf("2 | 9 = %i\n", 2 | 9); // 11    // 按位异或    printf("2 ^ 9 = %i\n", 2 ^ 9); // 11    // 取反    printf("~ 11 = %i\n", ~ 11); // -12    printf("~ 9 = %i\n", ~ 9); // -10    printf("~ -9 = %i\n", ~ -9); // 8            /*          << 左移          a << n 把整数a的二进制位往左边移n位     移出的位砍掉,低位补0, 发现左移会把原有的数值变大     9 << 1 = 18  9 * 2(1) = 18     9 << 2 = 36  9 * 2(2) = 36     9 << n =  9 * 2(n)     左移的应用场景:当要计算某个数乘以2的n次方的时候就用左移,效率最高          0000 0000 0000 0000 0000 0000 0000 0000     100 0000 0000 0000 0000 0000 0000 10010          注意点:左移有可能改变数值的正负性(因为左移会砍掉符号位)          */        /*          >> 右移          a >> n 把整数a的二进制位往右边移n位     移出的位砍掉, 缺少的一位最高位是0就补0是1就补1(是在当前操作系统下) ???     9 >> 1 = 4  9 / 2(1) = 4     9 >> 2 = 2  9 / 2(2) = 2     右移的应用场景:当要计算某个数除以2的n次方的时候就用右移,效率最高     0000 0000 0000 0000 0000 0000 0000 0000     000000 0000 0000 0000 0000 0000 0000 10          */        int result1 = -19 << 2; //?????    /**     -19 ---> 1000 0000 0000 0000 0000 0000 0001 0011(原码) ---> 1111 1111 1111 1111 1111 1111 1110 1100(反码)         ---> 1111 1111 1111 1111 1111 1111 1110 1101(补码) ---> 11 1111 1111 1111 1111 1111 1110 1101 00(左移两位)         ---> 1111 1111 1111 1111 1111 1111 1011 0100(整理一下) ---> 1111 1111 1111 1111 1111 1111 1011 0011(反码)         ---> 1000 0000 0000 0000 0000 0000 0100 1100(原码) ---> - 76     */        int result2 = 21 >> 3;    /**     21 ---> 0000 0000 0000 0000 0000 0000 0001 0101(原码) ---> 000 0000 0000 0000 0000 0000 0000 0001 0(补码==原码 直接移位)        ---> 0000 0000 0000 0000 0000 0000 0000 0010(整理一下) ---> 2     */        printf("result1 =  %d\nresult2 =  %d\n", result1, result2);        return 0;}/* 位运算都是针对二进制的(把他们的二进制数进行运算) 按位 与    &     有假则假(对应数位比较) 按位 或    |     有真则真 按位 异或   ^     不同为1,相同为0 按位 取反   ~    先将其补码取反,再计算出新的原码  按位异或 注意几点: 1、多个整数按位异或的结果和顺序无关                9 ^ 6 ^ 3 == 3 ^ 9 ^ 6 2、相同整数按位异或结果是0                        8 ^ 8 == 0 3、任何整数按位异或上0结果不变                    2 ^ 0 == 2 4、任何整数按位异或上另一个整数两次结果还是那个数    1 ^ 7 ^ 7 == 1 ^ (7 ^ 7) == 1 ^ 0 == 1 按位取反: ~ 11 = ~[0000 0000 0000 0000 0000 0000 0000 1011] 原码/反码/补码      = [1111 1111 1111 1111 1111 1111 1111 0100] 补码取反结果(连符号位也变了!!!!!!!!!!!!)      = [1111 1111 1111 1111 1111 1111 1111 0011] 反码      = [1000 0000 0000 0000 0000 0000 0000 1100] 原码      = -12  ~ 9 = ~[0000 1001] 原码/反码/补码     = [1111 0110] 补码取反结果     = [1111 0101] 反码     = [1000 1010] 原码     = -10  ~ -9 = ~[1000 1001]      = ~[1111 0110]      = ~[1111 0111]      = [0000 1000]      = 8  问题1:不通过第三个变量,交换两个变量的值       a = a ^ b;       b = a ^ b;       a = a ^ b;  问题2:通过运算符判断一个数字的奇偶性(奇数的二进制表示末尾为1,偶数二进制数表示末尾为0)       if ((number & 1) == 1) // 如果该数            return "奇数";       else             return "偶数";  */

0 0