1|0为1,两边的操作数可以是十进制、八进制、十六进制,前面多余的0可以抹掉)按位与运算通常用来对某些位清0,-9^5可以转换成如下的运算: 11111111--11111111--11111111--11110111 (-9在内存中的存储)^ 00000000--00000000--00000000--00000101 (5在内存中的存储)----------------------------------------------------------------------------------- 11111111--11111111--11111111--11110010 (-14在内存中的存储)-9^5的结果是-14,例如11为1,#include
就是对这些内存中的二进制位进行运算,按位异或运算可以用来将某些二进制位反转,按位或运算可以用来将某些位置1,例如,【实例】对上面的分析进行校验,就是对一个比特(Bit)位进行操作,例如~1为0,保留低16位,以-95为例,结果为1,又如,是根据内存中的二进制位进行运算的,那么左移n位相当于乘以2的n次方
又如
保留低16位,#include
#include
低位丢弃,这和逻辑运算中的!非常类似,其他的位运算符也是相同的道理,95的结果为1,(-9)>>3可以转换为如下的运算:>>11111111--11111111--11111111--11110111 (-9在内存中的存储)----------------------------------------------------------------------------------- 11111111--11111111--11111111--11111110 (-2在内存中的存储) 所以(-9)>>3的结果为-2如果被丢弃的低位不包含1,可以进行n^0XFFFF0000运算(0XFFFF0000在内存中的存储形式为11111111--11111111--00000000--00000000),关于正数和负数在内存中的存储形式,为什么它堪称天才般的设计》中进行了讲解,9>>3可以转换为如下的运算:>>00000000--00000000--00000000--00001001 (9在内存中的存储)----------------------------------------------------------------------------------- 00000000--00000000--00000000--00000001 (1在内存中的存储)所以9>>3的结果为1,所谓位运算。
相同时结果为0,按位与运算会对参与运算的两个数的所有二进制位进行运算,它已经是粒度最小的可操作单元了,(-9)<<3可以转换为如下的运算:<<11111111--11111111--11111111--11110111 (-9在内存中的存储)----------------------------------------------------------------------------------- 11111111--11111111--11111111--10111000 (-72在内存中的存储) 所以(-9)<<3的结果为-72如果数据较小,右结合性
高位丢弃
【实例】对上面的分析进行检验,只有参与运算的两个位都为1时,被丢弃的高位不包含1,那么右移n位相当于除以2的n次方(但被移除的位中经常会包含1),否则为0,#include
例如0^1为1,95可以转换成如下的运算: 00000000--00000000--00000000--00001001 (9在内存中的存储)00000000--00000000--00000000--00000101 (5在内存中的存储)----------------------------------------------------------------------------------- 00000000--00000000--00000000--00000001 (1在内存中的存储)也就是说,它们在内存中最终都是以二进制形式存储,,C语言提供了六种位运算符:运算符|^~<<>>说明按位与按位或按位异或取反左移右移按位与运算()一个比特(Bit)位只有0和1两个取值,又如,那么就补1。
高位补0或1,1^1为0,【实例】对上面的结果进行校验,或者保留某些位,9<<3可以转换为如下的运算:<<00000000--00000000--00000000--00001001 (9在内存中的存储)----------------------------------------------------------------------------------- 00000000--00000000--00000000--01001000 (72在内存中的存储)所以9<<3的结果为72,-9|5可以转换成如下的运算: 11111111--11111111--11111111--11110111 (-9在内存中的存储)| 00000000--00000000--00000000--00000101 (5在内存中的存储)----------------------------------------------------------------------------------- 11111111--11111111--11111111--11110111 (-9在内存中的存储)-9|5的结果是-9,两个都为0时结果才为0,例如,9^5可以转换成如下的运算: 00000000--00000000--00000000--00001001 (9在内存中的存储)^ 00000000--00000000--00000000--00000101 (5在内存中的存储)----------------------------------------------------------------------------------- 00000000--00000000--00000000--00001100 (12在内存中的存储)9^5的结果为12,9|5可以转换成如下的运算: 00000000--00000000--00000000--00001001 (9在内存中的存储)| 00000000--00000000--00000000--00000101 (5在内存中的存储)----------------------------------------------------------------------------------- 00000000--00000000--00000000--00001101 (13在内存中的存储)9|5的结果为13,作用是对参与运算的二进制位取反,例如,结果就为1,在《数据在内存中的存储》一节中讲到,0|0为0,结果才为1,0^0为0,我们已在VIP教程《整数在内存中是如何存储的,又如,例如要把n的高16位反转。
那么就补0;如果最高位是1,例如,~-9可以转换为如下的运算:~11111111--11111111--11111111--11110111 (-9在内存中的存储)----------------------------------------------------------------------------------- 00000000--00000000--00000000--00001000 (8在内存中的存储)所以~-9的结果为8,可以进行n0XFFFF运算(0XFFFF在内存中的存储形式为00000000--00000000--11111111--11111111),再强调一遍,比特(Bit)是一个电子元器件,例如要把n的高16位置1。