美文网首页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);

相关文章

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

    文章摘要:1、按位或:给指定位设定为1;2、按位与:清零、取特定位; 一、按位或的作用用途:给指定位设定为1;其中...

  • &:按位与、|:按位或、^:按位异或、~:按位取反

    主要针对于整数运算(转换成二进制)。 &:按位与:对应位都是1 则返回 1;只要有一个不是1 则返回 0;|:按位...

  • ios 中的位运算

    位运算的符号:~ | & ^ << >>分别代表的是按位取反,按位或,按位与,按位异或,左移,右移 按位取反操作 ...

  • 按位与(&)按位或(|)按位异或(^)按位取反(~)左移

    看源码期间遇到了取反(~),就做个记录。 基础知识: 1. and(&)运算 (按位与) and运算通常用于二进制...

  • C、数据结构知识点

    1. 位运算符有: &(按位与)、|(按位或)、^(按位异或)、~ (按位取反)。 其中,按位取反运算符是单目运算...

  • 位运算

    名称符号 按位与 & 按位或 | 按位异或 ^ 按位取反 ~ 左移运算 << 右移运算 >> &按位与的用法(相同...

  • ~ 按位取反<< 左移 右移<<= 左移并赋值= 右移并赋值& 按位与^ 按位异或| 按位或&= 按位与赋值^...

  • 位运算:包括按位与(&)、按位或(|)、异或(^)、按位取反(~)以及移位(<<,>>)。“与”同为‘1’为‘...

  • js 中位运算的应用

    按位运算符有6个: 按位与 & 按位或 | 按位异或 ^ 取反 ~ 右移 >> 左移 << 应用...

  • 位运算(了解)

    本篇文章仅作为了解 位运算 & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 按位与 & 一...

网友评论

  • 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