对于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=0a^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语言中的位操作符的理解已经颇深,相信在以后的学习和使用中一定可以游刃有余,如果我的内容对您有所帮助,希望能给个关注,三连,互相支持!