C语言运算符主要包括:与、或、异或、取反、左移和右移。
一、按位与(&)
如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
应用:
1.清零
若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:
原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。
a 00101011
b 10010100
c 00000000 //c = a & b
2.取一个书中某些指定位
若有一个整数a(2byte),想要取其中的低字节,只需要将a与8个1按位与即可。
a 00101100 10101100
b 00000000 11111111
c 00000000 10101100 //c = a & b
3.保留指定位
a 01010100
b 00111011
c 00010000 //c = a & b
二、按位或(|)
两个相应的二进制位中只要有一个为1,该位的结果值为1。借用逻辑学中或运算的话来说就是,一真为真
应用:将一个数据的某些位定值为1
a 00110000
b 00001111
c 00111111 //c = a | b
三、按位异或(^)
若参加运算的两个二进制位值相同则为0,否则为1
应用:不用临时变量,交换两个值
计算前:
a=3,即011(2);b=4,即100(2)
计算过程:
a=a ^ b; //即111 = 011 ^ 100
b=b ^ a; //即011 = 100 ^ 111
a=a ^ b; //即100 = 111 ^ 011
计算后:
a=100(2)即 4 ;b = 011(2)即 3;
四、取反(~)
~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
五、左移(<<)
用来将一个数的各二进制位全部左移N位,右补0
六、右移(>>)
将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
七、原码,反码,补码的基础概念和计算方法
1.原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值
比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111] 即 [-127 , 127]
原码是人脑最容易理解和计算的表示方式。
2.反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
3.补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.
补码举例:16位的变量求补码,比如-266的补码求法:((266^0xffff)+1) 结果是0xfef6。