一、右移(>>) 左移(<<)
移位操作符分为:1.算术移位;2.逻辑移位。 通常情况下用的是算术移位,逻辑移位比较少见。(移位不能移动负数位)
算术移位:1.右移操作:右移操作是指把该变量的值的二进制所表达的数值向右移动丢弃最右边的n位数字,正整数最左边补0,负整数最左边补1。(右边丢弃,左边补0或1,补的就是符号位)
2.左移操作:左移操作是指 把该变量的值的二进制所表达的数值向左移动丢弃最左边的n位数字,最右边的空缺位补0。(左边丢弃,右边补0)
Ps:右移需要考虑数值的正负,左移不需要考虑!
右移设计的一些知识点:
三码:原码 反码 补码
数字在内存中的存贮形态为补码,但是正整数和负整数的三码有不同的性质。
正整数的三码是相同的,而负整数的三码是不一样的,具体规律:反码等于原码反过来(符号位不变),补码==反码+1。反过来就相当于负整数的反码==补码-1,由此为我们来举例:把-1向右移一位!
-1是int类型,在内存中占用4个字节,一个字节是8个bit,那么
-1的原码就是:00000000 00000000 00000000 00000001(要进行移位我们要先转化成补码)
-1的反码就是:11111111 11111111 11111111 11111110
-1的补码就是:11111111 11111111 11111111 11111111(反码+1)(接下来向右移动一位,最前方补1)(因为是负数,所以补1)
操作后的补码就是:11111111 11111111 11111111 11111111(接下来就从补码到原码进行转换)
操作后的反码就是:11111111 11111111 11111111 11111110(补码-1)
操作后的原码就是:00000000 00000000 00000000 00000001
所以对-1进行右移一位操作后的结果就是-1。
Attention:前方原码、反码、补码的第一位数字就是整型变量的符号位!
二、(双目操作符)按位与(&) 按位或(|) 按位异或(^)
这三个操作都是对变量的值的补码进行操作的。如果是正整数三码相同就不用转换补码,但是如果是负整数就要先转换补码,然后再进行操作。(进行此操作时符号位也进行按位操作)
按位与:0&0=0; 0&1=0; 1&0=0; 1&1=1
按位或:0|0=0: 0|1=1; 1|0=1; 1|1=1
按位异或:0^0=0; 0^1=1; 1^0=1; 1^1=0(相同为0,相异为1)
三、(单目操作符)sizeof();按位取反(~) ;前置++\--或后置++\--;强制类型转换(类型)
sizeof()是求操作数的类型长度的操作,当后边跟变量名称时可以省略括号;
按位取反:取反的时该变量的二进制位0取反=1,1取反=0;
++\--前置:先++\--,后使用;++\--后置:先使用,后++\--;
强制类型转换格式:(转换后的变量类型)变量名称\数值,以此来强制转换变量类型。