内容
1.常用操作符
2.运算优先级
3.求两个数二进制形式不同位的个数
4.分别输出一个数二进制奇数位与偶数位
5.改写一个数二进制某一位的值
——————————————————————————————————————————————
*1.常用操作符与表达式运算
(1)算术操作符
- 加减乘除 :+ 、-、 *、 /、 %;
(2)移位操作符
- << 左移操作符——抛弃左边,右边补0;每左移一位=>相当于 * 2;
- << 右移操作符
- 算术右移:最低位不要了,整体向右移一位,最高位补符号位(0表示整数,1表示负数)每右移一位=>相当于/ 2;
- 逻辑右移: 最低位不要了,整体向右移一位,最高位补0;
注意:位移运算,不能移动负数位;相对于位移运算,CPU计算乘除法相对低效,故如果代码中需要计算乘除 2^n <=>位移运算。
(3)位操作符
- & //按位与——同位对应都为1=>1,否则为0;
- | //按位或——同位对应都为0=>0,否则为1;
- ^ //按位异或——同位对应相同为0,否则为1;
注:他们的操作数必须是整数
(4)赋值操作符
- =、 += 、-= 、*= 、/=、%=、|=、&=、^=、<<=、>>=
(5)单目操作符
- !逻辑反操作、+正-负、~对一个二进制进行按位取反操作、前置/后置++/–、&取地址操作符、*间接访问操作符/解引用操作符、sizeof计算操作数类型长短(单位字节)、(类型)强制类型转换操作
(6)关系操作符
- 比较:>、<、>=、<=、!=、==
(7)逻辑操作符
- 逻辑与:&&
- 逻辑或:||
(8)条件操作符
- 三目运算符:exp1 ? exp2 : exp3 (exp1值为真,则运算结果为exp2;否则结果为exp3)
(9)逗号表达式
- 从左到右依次执行,表达式结果=>最右侧表达式的值;exp1, exp2, exp3, …expN;
(10)下标引用、函数调用和结构成员
- 标引用操作符:[ ]; 数组名[索引值]; arr[1]——相当于访问数组第二个元素;
- 函数调用操作符:( );函数名(参数名);
- 访问结构的成员:
- 访问结构体成员操作符:. ;
- 访问结构体指针操作符:-> ;
注意:
- 表达式求值:一般由操作符的优先级和结合性来决定;有些表达式在求值计算过程中操作数会转换成别的类型;
- 隐式转换:C的整型算术运算总是至少以缺省整型类型的精度来进行的(4个字节);
- 整型提升:为了获得统一的精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型;整形提升是按照变量的数据类型的符号位来提升的;(只要参与表达式运算,就会发生整型提升)
(11)操作符属性(复杂表达式的求值有三个影响的因素):
- 操作符的优先级
- 操作符的结合性
- 是否控制求值顺序
ab + cd + e*f ; 或 c+ --c;虽然相邻两个操作符之间能够根据优先性和结合性计算,但是多个操作数的计算或者同级别的并列计算无法判断先后顺序,故结果是不可预测的,是有歧义的;测试结果:判定为非法表达式程序;
注意:如果写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题的。
(12)算术转化: 如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。
注意:如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算;算术转换要合理,要不然会有一些潜在的问题(精度丢失)。
*2.运算优先级
*3.求两个数二进制形式不同位的个数
#include<stdio.h>
#include<stdlib.h>
int diffBinary(int a, int b) {
int num = a ^ b;
int count =0;
for (int i = 0; i < 32; i++) {
if (num & (1 <<i)) {
count++;
}
}
return count;
}
int main() {
int a = 2;
int b = 3;
int ret = diffBinary(a, b);
printf("%d和%d 二进制形式不同位的个数为: %d\n", a, b, ret);
sysytem("pause");
return 0;
}
*4.分别输出一个数二进制奇数位与偶数位
#include<stdio.h>
#include<stdlib.h>
//分别输出一个数二进制奇数位与偶数位
void printBinary(int num) {
printf("num的二进制偶数位为:");
for (int i = 31; i >= 1; i -= 2)
{
printf("%d ", (num >> i) & 1);
}
printf("\nnum的二进制奇数位为:");
for (int i = 30; i >= 0; i -= 2)
{
printf("%d ", (num >> i) & 1);
}
printf("\n");
}
int main() {
int num = 2;
printBinary(num);
sysyetm("pause");
return 0;
}
*5.改写一个数二进制某一位的值
(1)改写一个数二进制某一位的值为1/0;
#include<stdio.h>
#include<stdlib.h>
int main() {
int a = 1;
a=a|(1<<1); //把a=1 的第二位改为1=>a变为3
printf("把1 的第二位改为1后值为:%d\n", a);
a = a & (~(1 << 0)); //把a=3 的第一位改为0=>a变为2
printf("把3 的第一位改为0后值为:%d\n", a);
system("pause");
return 0;
}