c语言初识-操作符

目录

注:阅读此章需要掌握二进制转换;若有所欠缺,请阅最后部分;

算数操作符:+ - * / %

位移操作符:>>    <<

位操作符:& ^  |

位操作符训练:两数交换;

//编写代码实现:求一个整数存储在内存中的二进制中1的个数。

方法一:

 方法二:

逻辑操作符:

条件操作符    exp1?exp2 : exp3

二进制计算


注:阅读此章需要掌握二进制转换;若有所欠缺,请阅最后部分;

算数操作符:+ - * / %

#include <stdio.h>
int main()
{
    //除法
	float a1 = 10 / 3;  //3.00000       整数相除
	float a2 = 10 / 3.0;    //3.33333   精确到小数后,一边需要是小数的形式
	printf("a1=%f\na2=%f\n", a1, a2);

	//%
	float a3 = 10 % 3;     //两端必须都是整数
	//float a2 = 10 % 3.0;    //err
	printf("a3=%f\n", a3);    
    return 0;
}

位移操作符:>>    <<

int main()
{
	//移位操作符
	//左位移符  <<
	int num1 = 5;
	int num2 = -2;
	printf("%d", num1<<1);
	// 原 :00000000 00000000 00000000 00000101  (正数原反补一样)
	// <<1: 00000000 00000000 00000000 00001010		10

	printf("%d", num2<<1);
	//  原: 10000000 00000000 00000000 000000010
	//	反: 11111111 11111111 11111111 111111101
	//  补: 11111111 11111111 11111111 111111110
	//  <<1: 11111111 11111111 11111111 111111100
	//  反: 11111111 11111111 11111111 111111011 
	//  原: 10000000 00000000 00000000 000000100  -4


	//右移操作数
	// 1.右边丢弃,左边补原符号			合理
	// 2.右边丢弃,左边补0       (用哪一种,看编译器)

	printf("%d", num1 >> 1);
	//  原:00000000 00000000 00000000 00000101
	// >>1:00000000 00000000 00000000 00000010		2	

	printf("%d", num2 >> 1);
	// 原:10000000 00000000 00000000 00000001
	// 反:11111111 11111111 11111111 11111110
	// 补:11111111 11111111 11111111 11111111
	// >>1 11111111 11111111 11111111 11111111	  右移	
	// 补: 11111111 11111111 11111111 11111110    -1
	// 反: 10000000 00000000 00000000 00000001    取反      
	//	-1

	//注意位移符不要移位负数  num2>>-1


	return 0;
}

位操作符:& ^  |

#include <stdio.h>

int main()
{
	//& ^ |
	//按位与:  &有0为0,全1为一
	//按位或:  |有1为1;全0为0
	//按位异或:  ^相同为0,不同为1
	int num1 = 2;
	int num2 = 3;

	printf("%d", num1 & num2);  //1
	//00000000 00000000 00000000 00000001
	//00000000 00000000 00000000 00000011
	//00000000 00000000 00000000 00000001

	printf("%d", num1 | num2);  //3
	//00000000 00000000 00000000 00000001
	//00000000 00000000 00000000 00000011
	//00000000 00000000 00000000 00000011

	printf("%d", num1 ^ num2);  //2
	//00000000 00000000 00000000 00000001
	//00000000 00000000 00000000 00000011
	//00000000 00000000 00000000 00000010

    return 0;
}

位操作符训练:两数交换;

#include <stdio.h>
int main()
{
    int num1 = 2;
    int num2 = 3;
    //异或					2    3                      仅仅适用于正整数交换
	num1 = num1 ^ num2; // 010  011  =  001
	num2 = num1 ^ num2; // 001  011  =  010(2)  
	num1 = num1 ^ num2; // 001  010  =  011(3)
    return 0;
}

//编写代码实现:求一个整数存储在内存中的二进制中1的个数。

int main()
{
	int num = -1;
	int i = 0;
	int count = 0;//计数
	while (num)
	{
		count++;
		num = num & (num - 1);
	}
	printf("二进制中1的个数 = %d\n", count);

    
    //方法二:
    int i = 0;
	int count = 0;
	for (i = 0; i < 32; i++)
	{
		if (((num1 >> i) & 1) == 1)
			count++;
	}
	printf("num1二进制有%d个1", count);
	return 0;
}

方法一:

        不断使用按位与进行除1;将结果用于下一次继续比较;直到把全1变为0;循环了多少次,就有多少的1;

 方法二:

        每次循环会将num1的二进制向右移一位,随后与1的二进制比对,结果为1;则count++;

循环32次结束,count记录num1中二进制有多少1;

逻辑操作符:

int main()
{
    //逻辑操作符
	//&& 两个表达式,左边为假,右边则不会执行
	//|| 两个表达式,左边为真,右边则不会执行

	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = ++a && ++b && d++;
    printf("%d %d %d",a,b,c);
    return 0;
}

条件操作符    exp1?exp2 : exp3

int a = 0;
int b = 0;

//表达式为真执行a++.为假b++
a>b?a++:b++;

printf("%d %d",a,b);

逗号操作符
(exp1,exp2,exp3,exp4)    整个表达式最后结果以exp4为准,,,前面的表达式也会执行

二进制计算

二进制分别有   原码:通过位来计算对应数值

                        反码:原码的基础上,符号位(二进制首位,0为正,1为负)不变,其余取反

                       补码:反码的基础上,+1

5的反码:01111111 11111111 11111111 11111010

5的补码: 01111111 11111111 11111111 11111011

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值