一、二进制和进制转换
二、原码、反码、补码
整数的二进制有三种表示方法,即原码、反码、补码
有符号的整数三种表示方法均有符号位和数值位两个部分,最高位的1位是当作符号位,其他都是数值位。正——0,负——1
正整数的三种表示都一样
负整数的三种表示方法各不相同
- 原码:翻译成二进制数
- 反码:将原码符号位不变,其余的依次取反
- 补码:在反码的基础上+1(补码获得反码:取反,+1)
int a=-10 4个字节,32个bit位
原码=10000000 00000000 00000000 00001010
反码=11111111 11111111 11111111 11110101(0变成1,1变成0)
补码=11111111 11111111 11111111 11110110(在反码的基础上加1)
对于整形来说,数据存放内容其实存放的是补码,数值的计算也使用的是补码
原码取反+1得到补码,补码取反+1得到原码
三、移位操作符(整数)
- <<
- >>
- 移位操作符的操作数只能是整数(二进制数)
- 移位操作符:玩右移补符号位,往左移补0
- 左移操作符
规则:抛弃左边,右边添0
int a=6
a=00000000 00000000 00000000 00000110 原码/反码/补码
int b = (a<<1)
b=00000000 00000000 00000000 00001100=12
注意:a的值是不变的
int a=-6
a=10000000 00000000 00000000 00000110 原码
a=11111111 11111111 11111111 11111001 反码
a=11111111 11111111 11111111 11111010 补码
int b=(a<<1)=-12
b=11111111 11111111 11111111 11110100 补码
b=10000000 00000000 00000000 00001011 反码
b=10000000 00000000 00000000 00001100 原码
注意:补码去计算,打印的是原码
- 右移操作符
逻辑右移:左边添0,右边抛弃
算数右移:左边用原有的操作符填充,右边丢弃
-1>>1是算数右移(大多数见到是算数右移)
因为当是负数时,如果第一位变成0不能表示负数,所以用的时算数右移
对于移位运算符,不要移动负数位
四、位操作符 & | ^ ~
- & 按位与
- | 按位或
- ^ 按位异或
- ~ 按位取反
1、按位&(有0则为0)
2、按位或|(两个为0才为0)
3、按位异或^(相同为0,相异为1)
4、按位取反(0——1,1——0,包括符号位)
五、异或例题
a=a^b
b=a^b=(a^b)^b=a^b^b=a
a=a^b=a^a^b=b
六、将二进制数的1的个数打印出来
1、方法一
输入n的值,在内存中存的是-1的补码,当n强制转化为1,所以它的原码和补码都相同了,因为没有符号位,就变成了一个很大的整数
2、方法二
- 我们只需要得到最后一位数字是多少
将输入的数字&1的二进制数=最后一位如果为0,就得到0。如果为1就得到1
- 然后运算一次后再>>1,去得到前一位的值,直到所有的数都被运算过一遍,也就是循环32次
3、方法3
因为n与n-1进行&运算,他总是能将最右边的1消灭掉
如何判断一个数是否是2的次方数
因为在2进制中,2的次方数的二进制数只有一个1
我们可以有count=1判断
也可以用n&(n-1)=0判断
七、二进制位置0置1
八、逗号表达式
- 从左向右计算,结果是最后一个表达式的结果
- 可以将上面的代码写出逗号表达式,从左向右计算,最后一个为真则执行