对于C语言的学习者,在读写代码的时候,位操作符这块的知识经常会让人头疼的很,所以本篇文章将会对C语言板块操作符及其用法阐述,尤其对于C的位操作符进行极其细致的分析,希望能给予您些许灵感!
1. 原码、反码、补码
想要学习C语言的位操作符,首先需要对原码、反码、补码有一定的认识!
整数的2进制序列表示⽅法有三种,即原码、反码和补码
对于整型来说:数据存放内存中存放的是补码,同时当我们在对整型数据进行运算的时候,计算的也是补码,再把得到的补码转化为原码才是最后的所看到的结果!
有符号整数的三种表示⽅法均有符号位和数值位两部分,2进制序列中,最⾼位的1位是被当做符号 位,剩余的都是数值位。
符号位都是⽤0表示“正”,⽤1表示“负”。
正整数的原、反、补码都相同。
负整数的三种表⽰⽅法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
反码得到原码也是可以使⽤:取反,+1的操作。
原反补码的相互转换如图:
举个例子:
正整数:
负数:
2.移位操作符
注:移位操作符的操作数只能是整数。
2.1 左移操作符: <<
移位规则:左边抛弃、右边补0
上面已经提过对整型数据进行操作的是它的补码,10左移一位后,其补码变成了:
00000000000000000000000000010100,又因为正整数的原反补码相同,所以移动后的数就直接可以得出是 20。
2.2 右移操作符:>>
移位规则:⾸先右移运算分两种:
1. 逻辑右移:左边⽤0填充,右边丢弃
2. 算术右移:左边⽤原该值的符号位填充,右边丢弃
3.位操作符
&:按位与(二进制序列上的对应位置数字全为1结果才为1,有一个为0结果则为0)
|:按位或(有1则为1,全0才为0)
^:按位异或(相异为1,相同为0)
~:按位取反(0变1,1变0)
以代码为例解析各个运算:
到此,已经对移位操作符和位操作符有了初步认识,接下来通过一些例题来加深理解!
4.移位和位操作符的综合使用
(1)不能创建临时变量(第三个变量),实现两个整数的交换
其本质为:a^a=0 a^0=a,知道这个就很好理解本题思路
(2)求⼀个整数存储在内存中的⼆进制中1的个数
法一:将整数32位分别与1做&运算,并进行计数
法二:关键是在 n = n & (n - 1);可以将原n二进制序列中最右边的1去掉,并重新赋值给n,进入下一次循环,直到变为0。
(3)将13⼆进制序列的第5位修改为1,然后再改回0
(4)输入两个整数,求两个整数二进制格式有多少个位不同
因为异或操作是相异为1,相同为0,所以可以将两数进行异或操作后,对其结果进行数1操作
(5)一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。(又名找单身狗2)
7.总结
相信到此,您对于C语言中的位操作符的理解已经颇深,相信在以后的学习和使用中一定可以游刃有余,如果我的内容对您有所帮助,希望能给个关注,三连,互相支持!