1. 在了解c语言操作符之前,我们需要横扫一些概念障碍。原码,反码,补码。(值得一提的是,这些是整数的二进制表示方法)接下来,我举个例子 ,大家就能对这几个概念有个清晰的了解。
首先,正整数的原码,反码,补码均相同。负整数才各不相同。
给这么一串数字10000000 00000000 00000000 00000001,这个二进制就表示-1.
再来00000000 00000000 00000000 00000001,这个二进制就表示1
有人发现不同,1和-1的二进制整数表示方式原来只在开头有区别,对的。负数的二进制符号位(也就是首位)是1,而正数的二进制符号位为0。
前面我们说过了只有负数三码才各不相同。接下来我们看看原码是怎么转化为补码和反码的。
10000000 00000000 00000000 00000001———原码
111111111 111111111 111111111 111111110————反码(符号位不变,其他的数字依次取反—0变成1,1变成0)
111111111 111111111 111111111 111111111————补码(在反码的基础上+1)
!!!需要我们注意的是,在对整数的二进制表达式进行操作符运行的,往往都是操作他们的补码,而打印往往打印他们的原码!!
2. 移位操作符(只能对整数进行操作)
2.1 <<左移操作符 >>右移操作符
——<<(左边抛弃,右边补0)
对(10000000 111111111 11111111 00000011)进行<<
00000001 111111111 11111111 00000110
——>>(右边抛弃,左边补该二进制数的“符号位”)
对 (1000000 111111111 11111111 00000011)进行>>
1100000 01111111 11111111 10000001
tips.原先的数为负整数,右移后在其最左边应补齐其的符号位“1”。
3.位操作符:& | ^ ~
3.1 &—————(有0即为0,两个都为1才能取1) 按位与
3.2 |——————(有1即为1,两个都为0才能取0)按位或
3.3 ^——————(相同为0,相异为1)按位异或
3.4 ~——————(取反:0变为1,1变为0)按位取反(这是一个单目操作符)
接下来,我们来聊一聊这个^(按位异或)
给这么一个例子(1)a^0==a(任何数按位异或与0都等于它本身)
101
000 ———101
(2)两个数互相按位异或,等到的结果为0
因为按位异或指的是,相同为0,相异为1,两个数均相同,所以他们得出来的结果,所有的位数均相同,所以得出来的结果为0000000,即为0
这里讲一个拓展应用,就是如何利用位操作符实现把一个数的二进制表达式中的1(逐个逐个)的去掉,这里有一个表达式为(n=n&(n-1))
例如 n=1111
n-1=1110
&
n=1110
以此类推,就可以逐个去掉一个数中的二进制数中的1.
1786

被折叠的 条评论
为什么被折叠?



