C语言:操作符与表达式、求二进制中不同位的个数、分别输出二进制的奇偶位、改写二进制特定位

内容

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;
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值