操作符
分类:
算术操作符 移位操作符 位操作符 赋值操作符
单目操作符 关系操作符 逻辑操作符 条件操作符
逗号表达式 下 标引用、函数调用和结构成员
算数操作符
+ - * / %
移位操作符
<< 左移操作符
>> 右移操作符
左移操作符移位规则:
左边抛弃、右边补0
右移操作符移位规则:
1.逻辑移位:左边用0填充,右边丢弃
2.算术移位:左边用原该值的符号填充,右边丢弃
警告:对于移位运算符,不要移动负数位,这个是标准为定义的。例如 :
int num = 10;
num >> -1;//error
位操作符
& //按位与
| //按位或
^ //按位异或 (相同为0,不同为1)
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
注:它们的操作数必须是整数
练习一下:
#include <stdio.h>
int main()
{
int num1 = 1;
int num2 = 2;
num1 & num2;
num1 | num2;
num1 ^ num2;
return 0;
}
一道变态的面试题:
不能创建临时变量,实现两个数的交换
#include <stdio.h>
#include <windows.h>
int main()
{
int a = 1;
int b = 2;
a = a^b;
b = a^b;
a = a^b;
printf("%d, %d", a, b);
system("pause");
return 0;
}
练习:
编写代码实现:求一个整数在二进制中1的个数
#include <stdio.h>
#include <windows.h>
//方法1
int main()
{
int num = 10;
int count = 0; //计数
while (num)
{
if (num % 2 == 1)
{
count++;
}
num /= 2;
}
printf("%二进制中1的个数 = %d\n", count);
system("pause");
return 0;
}
//思考这样的实现方式有没有问题?
#include<stdio.h>
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>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
while (num)
{
count++;
num = num&(num - 1);
}
printf("%二进制中1的个数 = %d\n", count);
system("pause");
return 0;
}
//这种方式是不是很好?达到了优化的效果,但是难以想到。