【C语言】操作符

前言
🎈大家好,我是何小侠🎈
🌀大家可以叫我**小何或者小侠🌀**
🔴我是一名普通的博客写作者🔴
💐希望能通过写博客加深自己对于学习内容的理解💐
🌸也能帮助更多人理解和学习🌸
🍃我的主页: 何小侠的主页🍃

在这里插入图片描述


    这篇博客我们一起来学习C语言中操作符的一些理解和技巧,可能不会涵盖所有操作符,但是应该会让你有所收获。

    移位操作符🍊

    移位操作符又分左移操作符和右移操作符

    << 左移操作符>> 右移操作符

    注意:移位操作符的操作数只能是整数。

    左移操作符🍊

    左移操作符操作的其实是操作数的二进制位,
    操作规则是左边丢弃,右边补0
    首先我们先介绍一些基本知识
    在这里插入图片描述
    然后我们再来看实际的代码:

    #include<stdio.h>
    int main()
    {
    	int a = 5;
    	int b = a << 1;
    	printf("%d\n", a);
    	printf("%d", b);
    
    	return 0;
    }
    

    我们看看这行代码的答案
    在这里插入图片描述

    结果 a = 5 ,b = 10,这两个数很巧,这其中会不会有什么关系呢?

    我们大胆猜测只要 左移1位就是将这个数扩大两倍。
    接下来我们看看二进制位的变化,来证明这个猜测。

    在这里插入图片描述
    或者写清楚点 2^1(2 ^ 2 + 2 ^ 0) = 2 ^ 3 + 2 ^ 1.
    相信大家看这张图就应该能够理解了。

    然后我们讨论为a = -5 的情况。

    #include<stdio.h>
    int main()
    {
    	int a = -5;
    	int b = a << 1;
    	printf("%d\n", a);
    	printf("%d", b);
    
    	return 0;
    }
    

    我们还是用图来讲解:
    在这里插入图片描述
    在这里插入图片描述
    其实还是相当于乘了一个2,
    在这里插入图片描述

    右移操作符🍊

    移位规则:
    首先右移运算分两种:

    1. 逻辑移位
      左边用0填充,右边丢弃
    2. 算术移位
      左边用原该值的符号位填充,右边丢弃
      算术右移和逻辑右移取决于编译器,一般都是算术右移,我用的VS也是算术右移。

    我们依旧是先上代码

    int main()
    {
    	int a = 5;
    	int b = a >> 1;
    	//00000000000000000000000000000101
    
    	printf("a=%d b=%d\n", a, b);
    	return 0;
    }
    
    

    结果是
    在这里插入图片描述

    我们还是大胆猜测是不是除过二就行了,我们先画图研究这个过程
    在这里插入图片描述
    在这里插入图片描述

    如果你还是不相信可以自己试一试.
    接下来我们看负数
    在这里插入图片描述
    这里的技巧是,把 (a + (-1)) / 2 就行了。

    位操作符🍊

    & 按位与
    | 按位或
    ^ 按位异或

    这三个也全都是操作二进制位,所以
    他们的操作数必须是整数。

    &

    int main()
    {
    
    		int a = 3;
    		int b = -5;
    		int c = a & b;
    		//00000000000000000000000000000011  -> 3的补码
    		//11111111111111111111111111111011  -> -5的补码
    	//&   00000000000000000000000000000011 (相同为1,相异为0)
    		//10000000000000000000000000000101  -> -5的原码
    		//11111111111111111111111111111010  -> -5的反码
    			printf("%d\n", c);
    }
    

    在这里插入图片描述

    |

    int main()
    {
    
    		int a = 3;
    		int b = -5;
    		int c = a | b;
    		//00000000000000000000000000000011  -> 3的补码
    		//11111111111111111111111111111011  -> -5的补码
    	//|   11111111111111111111111111111011 (有1为1,无1为0)补码还需要转换为原码
    		//10000000000000000000000000000101  -> -5的原码
    		//11111111111111111111111111111010  -> -5的反码
    			printf("%d\n", c);
    }
    

    在这里插入图片描述

    ^

    int main()
    {
    
    		int a = 3;
    		int b = -5;
    		int c = a ^ b;
    		//00000000000000000000000000000011  -> 3的补码
    		//11111111111111111111111111111011  -> -5的补码
    	//^   11111111111111111111111111111000  
    	//    11111111111111111111111111110111   反码
    	//    10000000000000000000000000001000   原码
    		//10000000000000000000000000000101  -> -5的原码
    		//11111111111111111111111111111010  -> -5的反码
    			printf("%d\n", c);
    }
    

    在这里插入图片描述
    最后我们要说^的技巧

    ^的技巧

    🍊

    如果一个a = 5
    那么a ^ a = 0.

    在这里插入图片描述
    如果a ^ 0 = a .
    在这里插入图片描述
    最后来一个经典的提莫

    现在有一个数组放了一个单身狗个单身狗,1 2 3 4 5 1 2 3 4找出这个单身狗。
    方法,将所有的数异或最后就变成了5^0就是5

    #include<stdio.h>
    int main()
    {
    	int arr[] = { 1,2,3,4,1,2,3,4,5 };
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	int i = 0;
    	int j = arr[0];
    	for (i = 1; i < sz; i++)
    	{
    		j ^= arr[i];
    
    	}
    	printf("%d", j);
    
    	return 0;
    }
    

    在这里插入图片描述

    总结🍊

    这篇博客我们介绍了移位操作符,和位操作符的技巧,希望能加强我们对于二进制的理解和熟练程度。

    最后如果这篇博客有帮助到你,欢迎点赞关注加收藏

    在这里插入图片描述在这里插入图片描述
    如果本文有任何错误或者有疑点欢迎在评论区评论
    在这里插入图片描述

    在这里插入图片描述

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

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    He XIAO xia

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值