一.位操作符
& //按位与
| //按位或
^ //按位异或
位操作符操作的数必须是整数.
1.按位“异或”运算(^)
按位“异或”运算符是双目运算符,其功能是将参与运算的两数的对应二进制位相“异或”。
运算规则:相同为0,相异为1。
运算特点:a:0异或任何数 == 任何数 b: 1异或任何数 == 任何数取反 c: 任何数异或自己 == 把自己置0
支持交换律:10 ^ 20 ^ 10 == 10 ^ 10 ^ 20 == 0 ^ 20 == 20
举例:
(1):实现两个值的交换,而不必 使用临时变量。这种方法因为不会产生进位,所以不会溢出,建议采用!!!
void Swap(int*xp, int*yp){
*xp ^= *yp;
*yp ^= *xp;
*xp ^= *yp;
}
(2):快速判断两个值是否相等
return ((a ^ b) == 0)
2.按位或(|)
运算规则:每一位上,有1为1,同0 为0.
3.按位与(&)
运算规则:每一位上,同为1时为1,否则为0.
注:任意一个数和-1按位与,得其本身。
按位与运算通常用来对某些位清0或保留某些位。
编写代码实现:求一个整数存储在内存中的二进制中的1的个数。
方法一:
#include<stdio.h>
#pragma warning(disable:4996)
int main(){
int num = 10;
int count = 0;//计数
while (num){
if (num % 2 == 1){//括号里的条件用于检测最低比特位
count++;
}
num = num / 2;
}
printf("二进制中1的个数 = %d\n", count);
system("pause");
return 0;
}
方法二:
#include<stdio.h>
#pragma warning(disable:4996)
int main(){
int num = -1;
int i = 0;
int count = 0;//计数
for (i = 0; i < 32; i++){
if (((num >> i) & 1) == 1){
count++;
}
}
printf("二进制中1的个数 = %d\n", count);
system("pause");
return 0;
}
方法三:
#include<stdio.h>
#pragma warning(disable:4996)
int main(){
int num = -1;
int count = 0;//奇数
while (num){
count++;
num = num&(num - 1);
}
printf("二进制中1的个数 = %d\n", count);
system("pause");
return 0;
}
二.移位操作符
1.<< 左移操作符
左移操作符 移位规则: 左边抛弃、右边补0
>> 右移操作符
右移操作符 移位规则: 首先右移运算分两种: 1. 逻辑移位 左边用0填充,右边丢弃 2. 算术移位 左边用原该值的符号位填充,右边丢弃
警告⚠ : 对于移位运算符,不要移动负数位,这个是标准未定义的。
三.逻辑操作符
1.逻辑与(&&)
即为and,当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false.(C语言中,0为假,非0为真)
比如:12 && 23 的结果就是1,12&& -1 的结果是1,123&& 0 的结果是0
而且如果第一个表达式为假,则不计算第二个表达式,例如,if(0 && printf("hello"));后面的表达式不会执行!!
2.逻辑或(||)
逻辑或,当两个条件中有任一个条件满足,“逻辑或”的运算结果就为真
eg:12 || 1 = 1,12 || 0 = 1,0 || 0 = 0
当第一个表达式为真,则不计算第二个表达式.
360面试题
#include<stdio.h>
#pragma warning(disable:4996)
int main(){
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;//a = 0,不会进行第一个逻辑与后的操作
//i = a++ || ++b || d++;第二个逻辑或后的操作不会进行
printf("a = %d\n b = %d\n c = %d\n d = %d\n i = %d\n", a, b, c, d, i);//1 2 3 4 0
//printf("a = %d\n b = %d\n c = %d\n d = %d\n i = %d\n", a, b, c, d, i);//1 3 3 4 1
system("pause");
return 0;
}
四.三元运算符(exp1 ? exp2 : exp3)
第一个是表达式,剩余两个是值,条件表达式为真时,取第一个值,为假时,取第二个值。
五.逗号表达式(exp1,exp2,exp3,....exp n)
1.从左向右依次执行且每个式子都要执行且结果是最后一个表达式的结果。
2.逗号表达式的优先级在所有运算符中最低 。
六.单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换