本节操作符类型
本节主要讨论位操作符:包括按位与&、按位或|、按位异或^。
以及讨论移位操作符:左移位<<,右移位>>
按位与&,是一个双目操作符。不同于取地址&。按位与&的计算是按照二进制位进行计算的。就是将两个数的二进制的每一个相同的序列位进行计算。只有全都为1,结果才为1。有一个不是1,结果就是0。
按位或|,同样是双目操作符。按位或|的运算法则是两个数进行或的运算,其二进制的每一个相同序列位进行运算,只要有1,就为1。全部为0,才为0。
按位异或^, 同样是一个双目运算符。运算法则是相同为0,相异为1。
这里需要知道的是,^满足结合律,交换律?
有一个比较经典异或运用的例题,如图:
如果不运用异或来求解,这道题可以使用相加减的方法进行求解,例如:
但是这里面有一个问题,那就是如果a与b很大,当a与b相加后超过了a变量所能存储的最大范围。那么这道题就不能很好的完成交换,出现问题。
但是如果我们使用异或进行求解就不需要担心这种问题:?
这就是异或的一个运用案例。
移位操作符,移动的都是二进制位。且必须是整型。即将计算机中保存的整型的二进制补码进行左右移位。
内存中的二进制补码整体向左移动一位,左边超出的部分丢弃,右边补零。如:
下面是运用实例:
右移位与左移位不同,分为算数移位与逻辑移位。
逻辑右移就是左边用零填充,右边直接丢弃。算数右移就是左边用原符号位进行填充,右边丢弃。采用?哪种右移方式主要取决于编译器,但是大部分编译器使用的是算数右移,vs2022同样采用算术右移。
其具体右移过程与左移类似,这里不加赘述。
接下来看几个例题。
这里就是应用的上面的位操作符,以及我在之前写的单目操作符~的运用,下面是解题过程:
下面是解题过程。?