「C 基础」位运算
2016-05-16 本文已影响32人
_凉风_
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
- 不同整数 相异或 结果和顺序无关,例:567 = 576
- 任何数 和 0 异或 结果不变,例:x^0 = x
- 综上,xyx = xxy = 0^y = y
4. ~ 按位 取反「NOR」
- 功能:对整数的 每一位取反,符号也位取反「取反:0取反为1,1取反为0」
- 例子:~9 = -10
5. << 左移
- 格式:整数<<左移个数
- 例子:x **<< **n
- 实质:x * 2的n次方
- 操作:把 x 的二进制位 向左移动 n 个单位,高位丢弃,低位补 0
6. >> 右移
- 格式:整数>>右移个数
- 例子:x** >> **n
- 实质:x / 2的n次方
- 操作:把 x 的二进制位 向右移动 n 个单位,低位丢弃,符号位不变
-
注意:符号位也跟着移动, 右移不改变整数的正负, 最后符号位要调整为原来的数值
正数 符号位为 0, 最高位补0
负数 符号位为 1, 最高位补1「取决于编译器的规定,这里以MAC的编译器为准」
7. 应用 「了解即可」
数值转换:
int a = 9;
int b = 6;
//1. 借助第三方变量
int temp;
temp = a;
a = b;
b = temp;
//2. 不借助额外空间,数学方法
a = b - a;
b = b - a;
a = b + a;
//3. 不借助额外空间,位运算
a = a ^ b;
b = a ^ b;
a = a ^ b;
奇偶判断:
int a=15;
// 方法1 取模判断
// 注:这里由于 printf()是有返回值「输出的字符串长度」
// 所以可以用 三位运算符 条件?值:值
a%2?printf(“奇数\n”):printf(“偶数\n”);
// 方法2 与1判断
// 由于:奇数,二进制最后一位是 1
// 偶数,二进制最后一位是 0
// 1 & X = X的二进制最后一位
a&1?printf(“奇数\n”):printf(“偶数\n”);