二进制运算

计算机中的数值表示

计算机以二进制表示数据,以表示电路中的正反。在二进制下,一个位只有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);
        }
    }
}

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值