「C基础」位运算

时间:2021-03-10 22:01:50

0. 原码、补码、反码

   初学者只做了解即可 见 张子秋的博客

   无论正负数,在内存中存储的都是补码

 正数:反码 == 原码 == 补码

   负数:反码 == ~原码

    补码 == 反码+1

1. & 按位 与「AND

 功能:对应的两个二进位 均为1 时,结果 为1,否则 为0

 例子:9&5 = 1001&0101 = 0001,即 9&5=1

  *规律:二进制中与 1& 保持原位,与  0& 为0

2. | 按位 OR

 功能:对应的两个二进位 只要有一个为1 时,结果 为1,否则 为0

 例子:9|5 = 1001|0101 = 1101,即 9|5=13

3. ^ 按位 异或XOR,EOR

 功能:对应的两个二进位 不相同 为1,否则 为0

 例子:9^5 = 1001^0101 = 1100,即 9^5=12 

  *规律:同一整数 相异或 为0,               例:5^5=0

       不同整数 相异或 结果和顺序无关,例:5^6^7 = 5^7^6

     任何数 和 0 异或 结果不变,        例:x^0 = x

       综上,x^y^x = x^x^y = 0^y = y

4. ~ 按位 取反「NOR

 功能:对整数的 每一位取反,符号也位取反「取反:0取反为1,1取反为0

 例子:~9 = -10

5. << 左移

 格式:整数<<左移个数

 例子:x << n

 实质:x * 2n

 操作:把 x 的二进制位 向移动 n 个单位,高位丢弃,低位补0

6. >> 右移

 格式:整数>>右移个数

 例子:x >> n

 实质:x / 2n

 操作:把 x 的二进制位 向移动 n 个单位,低位丢弃符号位不变

 注意:符号位也跟着移动, 右移不改变整数的正负, 最后符号位要调整为原来的数值

   正数 符号位为 0, 最高位补0

   负数 符号位为 1, 最高位补1「取决于编译器的规定,这里以MAC的编译器为准


 7. 应用 「了解即可」 

数值转换:

 1 int a = 9;
2 int b = 6;
3 //1. 借助第三方变量
4 int temp;
5 temp = a;
6 a = b;
7 b = temp;
8
9 //2. 不借助额外空间,数学方法
10 a = b - a;
11 b = b - a;
12 a = b + a;
13
14 //3. 不借助额外空间,位运算
15 a = a ^ b;
16 b = a ^ b;
17 a = a ^ b;

 

奇偶判断:

 1 int a=15; 
2 // 方法1 取模判断
3 // 注:这里由于 printf()是有返回值「输出的字符串长度」
4 // 所以可以用 三位运算符 条件?值:值
5 a%2?printf(“奇数\n”):printf(“偶数\n”);
6
7 // 方法2 与1判断
8 // 由于:奇数,二进制最后一位是 1
9 // 偶数,二进制最后一位是 0
10 // 1 & X = X的二进制最后一位
11 a&1?printf(“奇数\n”):printf(“偶数\n”);