美文网首页Java学习笔记Java学习笔记JavaEE 学习专题
Java 按位或、按位与、按位取反的妙用

Java 按位或、按位与、按位取反的妙用

作者: Android那些事儿 | 来源:发表于2016-12-04 21:29 被阅读377次

    文章摘要:
    1、按位或:给指定位设定为1;
    2、按位与:清零、取特定位;


    一、按位或的作用
    用途:给指定位设定为1;
    其中LAST_BIT_FLAG 就是我们经常用到的标记位。

    1、为number最后1位赋值为1.

    int LAST_BIT_FLAG = 0x01;
    int number = 0x60; //0x 0110 0000;
    int result = number | LAST_BIT_FLAG; //0x 0110 0001;
    System.out.println("number is:"+number
            +",result is:"+result);
    //number is:96,result is:97
    

    二、按位与的作用
    用途:清零、取特定位

    1、为number最后1位,清零。

    int ZERO_FLAG = 0xfe;//ZERO_FLAG = ~LAST_BIT_FLAG ;
    int number = 0x6f; //0x 0110 1111;
    int result = number & ZERO_FLAG; //0x 0110 0000;
    System.out.println("number is:"+number
     +",result is:"+result);
    //number is:111,result is:110
    

    总结:清零FLAG = 赋值FLAG取反。

    2、分别取出number的高四位,与低四位

    int LOWER_FOUR_BIT_FLAG = 0x0f,HIGH_FOUR_BIT_FLAG = 0xf0;
    int number = 0x6f;                         //0x 0110 1111;
    int lowResult = number & LOWER_FOUR_BIT_FLAG; //0x 0000 1111;
    int highResult = number & HIGH_FOUR_BIT_FLAG; //0x 0110 0000;
    System.out.println("number is:"+number
     +",lower4bit is:"+lowResult
     +",high4bit is:"+highResult);
    //number is:111,lower4bit is:15,high4bit is:96
    

    三、应用案例

    场景:
    短信简单分为三部分,主题、附件、正文。用户编辑短信,主题、正文等会发生改变,现在:需要打印短信状态,以及用户每次操作,改变了短信的那部分。

    分析:

    • 1、短信状态可以使用标识位(flags)来表示。
      设定状态使用“或”操作:flags |=HAS_SUBJECT;
      取消状态使用“与”、“非”操作:flags &=~HAS_SUBJECT;
    • 2、按位异或:相同为0,不同为1。
      每次短信操作改变部分:新flags与旧的flags 按位异或。
    private static final int HAS_SUBJECT = (1 << 0); // 1{0000 0001}
    private static final int HAS_ATTACHMENT = (1 << 1); // 2{0000 0010}
    private static final int HAS_CONTENT = (1 << 2); // 4{0000 0100}
    
        static class Sms {
            // 短信,初始化flag = 0,不含有主题、附件、正文
            private int flags = 0;
    
            private void updateSmsState(int state, boolean has) {
                int oldFlags = flags;
                if (has) {
                    flags |= state;
                } else {
                    flags &= ~state;
                }
                // 按位 异或,得到变化的flags
                int flagsChanges = oldFlags ^ flags;
                if ((flagsChanges & HAS_SUBJECT) != 0) {
                    System.out.println("\t【主题】标记状态发生了改变!");
                } else if ((flagsChanges & HAS_ATTACHMENT) != 0) {
                    System.out.println("\t【附件】标记状态发生了改变!");
                } else if ((flagsChanges & HAS_CONTENT) != 0) {
                    System.out.println("\t【正文】标记状态发生了改变!");
                } else {
                    System.out.println("\tflags标记状态没有发生改变!");
                }
            }
    
            private boolean hasSmsSubject(int smsFlag) {
                return (smsFlag & HAS_SUBJECT) > 0;
            }
    
            private boolean hasSmsAttachment(int smsFlag) {
                return (smsFlag & HAS_ATTACHMENT) > 0;
            }
    
            private boolean hasSmsContent(int smsFlag) {
                return (smsFlag & HAS_CONTENT) > 0;
            }
    
            public String toString() {
                String hasSubject = hasSmsSubject(flags) ? "[主题]" : "";
                String hasAttachment = hasSmsAttachment(flags) ? "[附件]" : "";
                String hasContent = hasSmsContent(flags) ? "[正文]" : "";
                return "短信:" + hasSubject
                        + "," + hasAttachment
                        + "," + hasContent;
            }
        }
    

    测试:

            // 初始化短信对象
            Sms sms = new Sms();
            System.out.println("初始化短信:" + sms);
    
            // 给短信设定主题
            sms.updateSmsState(HAS_SUBJECT, true);
            System.out.println("短信添加主题后:" + sms);
    
            // 给短信设定附件
            sms.updateSmsState(HAS_ATTACHMENT, true);
            System.out.println("短信添加附件后:" + sms);
    
            // 给短信设定正文
            sms.updateSmsState(HAS_CONTENT, true);
            System.out.println("短信添加正文后:" + sms);
    
            // 短信不能含有附件
            sms.updateSmsState(HAS_ATTACHMENT, false);
            System.out.println("短信去除附件后:" + sms);
    

    相关文章

      网友评论

      • c5651a28be45:明白了
        0 0: 0 0 0 0 0 0 0 0 无状态
        0|A → A: 0 0 0 0 0 0 0 1 具备了A状态
        0|B → B: 0 0 0 0 0 0 1 0 具备了B状态
        0|C → C: 0 0 0 0 0 1 0 0 具备了C状态
        A|B → AB: 0 0 0 0 0 0 1 1 具备了AB状态
        A|C → AC: 0 0 0 0 0 1 0 1 具备了AC状态
        B|C → BC: 0 0 0 0 0 1 1 0 具备了BC状态
        A|B|C→ ABC: 0 0 0 0 0 1 1 1 具备了ABC状态
        Android那些事儿: @独朗二八 赞👍
      • c5651a28be45:能不能详细解释下:
        if (has) {
        flags |= state;
        } else {
        flags &= ~state;
        }
        表示看不懂啊 :dizzy_face:
        Android那些事儿: @独朗二八 has表示是否存在该状态。

      本文标题:Java 按位或、按位与、按位取反的妙用

      本文链接:https://www.haomeiwen.com/subject/vczhmttx.html