运用异或交换2个数的值
这种利用位运算的交换方法只适用于整型变量,不能用于浮点型变量!
#include <stdio.h>
int main()
{
unsigned char x = 155;
unsigned char y = 200;
/*
x = x ^ y;
y = x ^ y;
x = x ^ y;
*/
x ^= y ^= x ^= y;
printf("x = %d, y = %d\n", x, y);
}
利用位与 & 运算,判断一个整数是否是2的整数次幂
int func(int num)
{
return ((num > 0) && ((num & (num - 1)) == 0));//2的n次幂大于0
}
对取余运算的说明
取余,也就是求余数,使用的运算符是 %。C 语言中的取余运算只能针对整数,也就是说,% 的两边都必须是整数,不能出现小数,否则编译器会报错。
另外,余数可以是正数也可以是负数,由 % 左边的整数决定:
- 如果 % 左边是正数,那么余数也是正数;
- 如果 % 左边是负数,那么余数也是负数;
100 % 12 = 4
100 % -12 = 4
-100 % 12 = -4
-100 % -12 = -4
不同长度的数据进行位运算
如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。
- 如果整型数据为正数,左边补 16 个 0。
- 如果整型数据为负数,左边补 16 个 1。
- 如果整形数据为无符号数,左边也补 16 个 0。
unsigned char a = 1;
short b = 123;
printf("%d", a & b); //结果为1
char a = 1;
short b = 123;
printf("%d", a & b); //结果为1
char a = -1;
short b = 123;
printf("%d", a & b); //结果为123
| 和 ||,& 和 && 的区别
举个例子,a=1 b=2
所以 a>0 这个值为true b>1 这个值为true b>2 这个值为 false
如 if(a>0&b>1) 我们可以得出 if(true&true),条件成立(true不为0,所以true&true不为0)
如 if(a>0&&b>1) 我们可以得出 if(true&&true),条件成立(&&两边操作数都非零,所以条件成立)
如 if(b>2&a>0) 我们可以得出 if(false&true),条件不成立(false为0,false&true为0,条件不成立)
如 if(b>2&&a>0) 我们可以得出 if(false&&a>0),条件不成立(&&左侧为false,&&运算到此结束,条件不成立)
& 和 && 在判断语句中都可以实现“和”这个功能,不过区别在于 & 两边都运算,而 && 先算 && 左侧,若左侧为 false 那么右侧就不运算了。因此从效率上来说,判断语句中推荐使用 &&。