补码和位运算符
1. 补码
(1)已知十进制求二进制
**求正整数的二进制**
除2取余,直至商为零,余数倒叙排序
**求负数的二进制**
先求与该负数相对应的正整数的二进制代码,然后将所有位取反,末尾加1,不够位数时左边补1
**求零的二进制**
全是零
(2)已知二进制求十进制
如果首位是0,则表明是正整数,按普通方法求
如果首位是1,则表明是负整数
将所有位取反,再加一,所得数字就是该负数的绝对值
如果全是零,则对应的十进制也是零
Q : 一个int型的变量所能够存储的数据范围是多大?
int占4个字节,32位
int所能存储的最大值二进制表示:
0111 1111 1111 1111 1111 1111 1111 1111
用十六进制表示 : 0x7FFFFFFF
int所能存储的最小值二进制表示:
1000 0000 0000 0000 0000 0000 0000 0000
用十六进制表示 0x80000000
2. 位运算符
(1)& —– 按位与
&& 逻辑与 是逻辑运算符(返回bool值)
& 位与和逻辑与完全不一样, &是按位比较
1&1 = 1
1&0 = 0
0&0 = 0
如 15 & 0 和 10 & 15 比较如下
1111 & 0000 = 0000
1010 & 1111 = 1010
(2) | —– 按位或 (和与规则相反)
(3) ~ —-按位取反
~i就是把i变量所有二进制位取反
(4) ^ —- 按位异或
相同位零 不同为1
(5)<< —- 按位左移
i<<3 表示把i的所有二进制位左移3位,右边补零
左移n位相当于乘以2的n次方,前提是数据不能丢失
(6)>> —- 按位右移
i>>3 表示把i的所有二进制位右移3位,左边一般是0,当然也可能补1(算数左移和逻辑左移)
右移相当于除以2的n次方
补充:
原码
- 也叫 符号-绝对值码
- 原码 最高位0表示正 1表示负,其余二进制位是该数字的绝对值的二进制位
- 原码存在加减乘除四种运算,且运算相对复杂,增加CPU的复杂度,零的表示不唯一