计算机中的数值表示
计算机以二进制表示数据,以表示电路中的正反。在二进制下,一个位只有0和1。逢二进一位。类似十进制下,一个位只有0~9。逢十进一位。
101//5的二进制
11//3的二进制
计算机中存储数据,以字节为单位,一个字节有8个位,即可以表示-128~127范围的数字。上述的二进制的完整表示为:
00000101//5的二进制
00000011//3的二进制
二进制的最高位0代表数值为非负数,1代表数值为负数,负数在下文提及,此处不赘述
逻辑运算:与、或、非
二进制有三种逻辑运算,也是为了便于二进制之间进行运算
与
运算符号为&,运算规律是:真真为真,真假为假,假假为假
1&1//1
1&0//0
0&0//0
或
运算符号为|,运算规律是:真真为真,真假为真,假假为假
1 | 1 //1
1 | 0 //1
0 | 0 //0
非
运算符为~,取反的逻辑,运算规律:二进制位若为1,取反后为0。若为0,取反后为1
~1 //~00000001 =>11111110//代表-2
正数、负数的表示
对于负数的表示,比较特殊,其有一条运算规律:对非负数的二进制进行取反、然后+1,便可得其负数的二进制表示,以3为例子:
00000011//3的二进制
//~00000011 对3进行取反,得到结果A
11111100
//对结果A进行+1
11111101//-3在计算机中的最终表示,给计算机看的,不是给人看的,
最终得出在一个字节下,11111101表示-3
加减法运算过程
计算机是用来计算的,那么必须支持最基本的加减法,这里以5和3的加减法为例:
加法 5+3
类似十进制的进位方式,二进制逢二进一
00000101 //5的二进制
+ 00000011 //3的二进制
= 00001000 //8的二进制
减法 5-3
对于5-3,可以看成 5+(-3),那么变相成加法运算了,然后按照加法的规则进行
00000101//5的二进制
+ 11111101//-3的二进制
= 100000010//258的二进制
5+-3=258,看起来显然不正确,这里已经超过了一个字节的表示范围-128~127,溢出的部分会被忽略掉。
1 00000010//超出的1部分,会被去掉,变成如下
00000010//2
利用溢出,就是可以实现减法的运算了:
00000101//5的二进制
+ 11111101//-3的二进制
= 00000010//2的二进制
将32位的int,转成31个布尔值
在java中,一个字节,也就是8位,而布尔值在java中至少占用一个字节(关于布尔值具体占几个字节,不在此处讨论),如果用户有7个属性,如是否为汉族、是否为男性等,如果全用布尔值来表示,就是7个字节。也可以用一个字节来表示,用0和1代表是和否。用1个字节替代7个字节来表示信息,空间节省80%以上,更别说是int等其他类型了:
需要解决如下几个问题:
怎么读取某个位是0还是1?
以第三位为例,即4的二进制00000100,利用与运算,可以值到某个位是否被置起来:
00001001//9的二进制
& 00000100//4的二进制
= 00000000//0的二进制
即 00001001 & 00000100 != 00000100 可判定,第三位没有被置起
00001101//13的二进制
& 00000100//4的二进制
= 00000100//4的二进制
即 00001101 & 00000100 == 00000100 可判定,第三位被置起了
怎么在不影响其他位的情况下,把某个位设为1?
这里会利用到或运算,我们还是以第三位为例子:
//当第三位没有被置起时
00001001//9的二进制
| 00000100//4的二进制
= 00001101//13的二进制
//当第三位被置起时,设置前后,值应该是不变的
00001101//13的二进制
| 00000100//4的二进制
= 00001101//13的二进制
怎么在不影响其他位的情况下,把某个位设为0?
这里会利用与、取反运算,我们仍以第三位为例子: 4的二进制00000100取反得到11111011
//当第三位没有被置起时
00001101//13的二进制
& 11111011//4的二进制取反
= 00001001
综上所述,最后将上面过程实现为如下java:
class BitUtil{
public static boolean check(int flag, int bit){
return (flag & bit) == bit;
}
public static int setBit(int flag, int bit, boolean value){
if(value){
return flag | bit;
}else{
return flag & (~bit);
}
}
}