我之前的博客写过~和!=EOF在多组输入时的应用。
这篇博客则是更系统地写一下几个位运算符, &,|,^,~
按位与&
一般使用形式为:a&b
和逻辑判断里一样,按位与,是对a和b进行按位比较(二进制),如果相同位置的数字相同且为1,这个时候结果的位置上为1,否则为0;
比如 3&5
3的二进制是0000 0011
5的二进制是0000 0101
这个时候3&5的结果就为1,因为只有2的0次方是相同的
当然a和b也可以是负数,负数以补码形式参与,便可自行得到结论。
按位或|
一般使用形式为:a|b
和逻辑判断里一样,相同位置上至少一个数字为1,那么结果就是1。
同样举出3|5
3的二进制是0000 0011
5的二进制是0000 0101
3|5的结果就为7。
按位异或^
一般使用形式为:a^b。只有相同位置上不同时,该位置才是1,否则为0
同样是3^5
3的二进制是0000 0011
5的二进制是0000 0101
3^5就是6
按位取反~
顾名思义,就是将每一位的1与0互换,1换为0,0换为1。
在测试的时候,我们不难发现,对一个正数取反,能得到其相反数减1的结果。
比如~3,可以得到-4的结果。
这是由于负数的存储形式是补码。
顺便讲一讲正整数、负整数的编码形式~
整数的二进制编码形式有三种:原码、反码、补码。
有符号的整数,2进制序列第一项表示正负,其中0为正,1为负。
正整数的原、反、补码都相同,比较省心。
负整数的原码即按照正负号规则翻译。
反码就是将原码符号位固定,其余位置按位取反。
补码是将反码+1就可得到。
为什么要出现补码?
我们不难(其实很难)发现,保持符号位不动,按位取反,+1的操作做两边,得到的编码是一致的。
那么进行一个相同的操作就可以直接得到原码了~。
计算机一律使用补码储存数值,使得符号位和数值域统一,加法和减法统一(CPU只有加法器),而且只用一套流程(取反,+1)。