位运算分为2个大类

  • 逻辑位运算
    • 运算符为:&、|、^、~ 。分别读作:位与、位或、异或、按位取反
  • 位移位运算
    • 运算符为:<<、>>。分别读作:左移、右移

位于 &(一0则0)

将两个十进制数转为二进制,将此两个二进制转换为列竖式,运算时两个位数任意一个是0则此位是0,有1个1则是1。然后将结果转为十进制。

    @Test
    void 位于() {
        System.out.println("12 转二进制是          :" + Integer.toBinaryString(12));
        System.out.println("10 转二进制是          :" + Integer.toBinaryString(10));
        System.out.println("12位于10 运算二进制结果是:1000");
        System.out.println("二进制的1000 转为十进制是:" + Integer.parseInt("1000", 2));
        System.out.println("12&10 -------------》 " + (12 & 10));
    }

控制台:
12 转二进制是          :1100
10 转二进制是          :1010
12位于10 运算二进制结果是:1000
二进制的1000 转为十进制是:8
12&10 -------------》 8

位或| (双0则0)

将十进制数转为二进制,将2个二进制的数转换为列竖式,两个位数都是0,则此位是0,否则是1。然后将此结果转为10进制

    @Test
    void 位或() {
        System.out.println("12 转二进制是          :" + Integer.toBinaryString(12));
        System.out.println("10 转二进制是          :" + Integer.toBinaryString(10));
        System.out.println("12位或10 运算二进制结果是:1110");
        System.out.println("二进制的1110 转为十进制是:" + Integer.parseInt("1110", 2));
        System.out.println("12|10 -------------》 " + (12 | 10));
    }  


控制台结果:
12 转二进制是          :1100
10 转二进制是          :1010
12位于10 运算二进制结果是:1110
二进制的1000 转为十进制是:14
12|10 -------------》 14

异或 ^(互异则1)

将十进制数转为二进制,将2个二进制的数转换为列竖式,两个位数不同时,则此位是1,否则是0。然后将此结果转为10进制

    @Test
    void 异或() {
        System.out.println("12 转二进制是          :" + Integer.toBinaryString(12));
        System.out.println("10 转二进制是          :" + Integer.toBinaryString(10));
        System.out.println("12异或10 运算二进制结果是:0110");
        System.out.println("二进制的0110 转为十进制是:" + Integer.parseInt("0110", 2));
        System.out.println("12^10 -------------》 " + (12 ^ 10));
    }


控制台结果:
12 转二进制是          :1100
10 转二进制是          :1010
12位于10 运算二进制结果是:0110
二进制的0110 转为十进制是:6
12^10 -------------》 6

利用异或可实现一个小面试题,如何不添加变量,实现数据的替换

    int a = 123;
    int b = 456;

    // 操作
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    // 完成

按位取反 ~

将十进制数转为二进制,将2个二进制的数转换为列竖式,

左移 <<(数值变大)

将十进制数转为二进制,原二进制向左移动X位,空位补0,然后将此结果转为10进制

    @Test
    void 左移() {
        System.out.println("12 转二进制是              :" + Integer.toBinaryString(12));
        System.out.println("1100 向左移动3位后 空位补0位 :1100000");
        System.out.println("1100000 转为十进制是       :" + Integer.parseInt("1100000", 2));
        System.out.println("12 << 3 -------------》 " + (12 << 3));
    }


控制台结果:
12 转二进制是              :1100
1100 向左移动3位后 空位补0位 :1100000
1100000 转为十进制是       :96
12 << 3 -------------》 96

右移 >>(数值变小)

将十进制数转为二进制,原二进制向右删除X位,然后将此结果转为10进制

    @Test
    void 右移() {
        System.out.println("12 转二进制是           :" + Integer.toBinaryString(12));
        System.out.println("1100 向右移动3位后      :1 (删除3位也就是删除110,只剩下1了。被删除的不补位)");
        System.out.println("1 转为十进制是          :" + Integer.parseInt("1", 2));
        System.out.println("12 >> 3 -------------》 " + (12 >> 3));
    }


控制台结果:
12 转二进制是           :1100
1100 向右移动3位后      :1 (删除3位也就是删除110,只剩下1了。被删除的不补位)
1 转为十进制是          :1
12 >> 3 -------------》 1

利用位运算表示状态

在Mysql我们可以利用字段来表示用户的某个属性或状态,但是如果用户有大量的状态,就会出现大量字段产生。如果不想数据表存在大量的数据,我们可以使用位运算,用一个数字的字段表示用户的状态。

思路:定义一个字段 数字类型 其数字表示了用户的多个状态!

  • 检测是否有状态 (oldStatus & someStatus) == someStatus
  • 添加状态 oldStatus = oldStatus | newStatus
  • 删除状态 oldStatus = oldStatus ^ newStatus

代码实现

    // 本代码有 查询、添加、删除状态
    @Test
    void 位运算实现变量多状态() {
        // 定义用户当前状态值
        int userStatus = 15;
        System.out.println("初始化状态:" + userStatus + " 转为十进制是:" + Integer.toBinaryString(userStatus));

        // 定义一些所有的可能性状态,自己的需求按需添加即可 本次定义依次是:无性别、男性、女性、未实名、已实名
        int noSex = 1 << 0;     // 1
        int man = 1 << 1;       // 2
        int woman = 1 << 2;     // 4
        int unName = 1 << 3;    // 8
        int named = 1 << 4;     // 16

        // 打印初始化状态
        System.out.print("初始化信息:");
        System.out.println(checkAllInfo(userStatus));

        // 添加一个已实名状态
        userStatus = userStatus | named;
        System.out.print("添加后的结果:");
        System.out.println(checkAllInfo(userStatus));

        // 删除无性别状态
        userStatus = userStatus ^ noSex;
        System.out.print("删除后的结果:");
        System.out.println(checkAllInfo(userStatus));

    }

    public static String checkAllInfo(int userStatus) {
        // 定义一些所有的可能性 如无性别、男性、女性、未实名、已实名
        int noSex = 1 << 0;     // 1
        int man = 1 << 1;       // 2
        int woman = 1 << 2;     // 4
        int unName = 1 << 3;    // 8
        int named = 1 << 4;     // 16
        StringBuilder info = new StringBuilder();
        if ((userStatus & noSex) == noSex) {
            info.append("无性别 ");
        }
        if ((userStatus & man) == man) {
            info.append("男性 ");
        }
        if ((userStatus & woman) == woman) {
            info.append("女性 ");
        }
        if ((userStatus & unName) == unName) {
            info.append("未实名 ");
        }
        if ((userStatus & named) == named) {
            info.append("已实名");
        }
        return info.toString();
    }

控制台结果

初始化状态:15 转为十进制是:1111
初始化信息:无性别 男性 女性 未实名 
添加后的结果:无性别 男性 女性 未实名 已实名
删除后的结果:男性 女性 未实名 已实名

本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。

最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或联络我们。

对于会员专享、整站源码、程序插件、网站模板、网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。

如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理

源码素材属于虚拟商品,具有可复制性,可传播性,一旦授予,不接受任何形式的退款、换货要求。请您在购买获取之前确认好 是您所需要的资源