今天需要在程序中做一个多选判断,突然想起以前经常遇到的 x |= y | z; 这样的,我也明白这个是多选的用意,但为什么能达到我们希望的多选操作,我还真的没去研究过。

今天早上,百度了一下,搜索到了两篇文章:

1) 这个是用C写的,道理都一样。摘自:http://blog.csdn.net/arduousbonze/article/details/1619096

三者的性质
异或运算:相同为0,不同为1
与运算:两者为1时为1,有0为0
或运算:有1为1

定义如下宏:(观察其特点)

#define FLAG_DUPLICATE   0x01   //展开二进制00000001 
#define FLAG_VISIBLE     0x02   //展开二进制00000010 
#define FLAG_CANSELECT   0x04   //展开二进制00000100 
#define FLAG_LABELED     0x08   //展开二进制00001000 
#define FLAG_BACKGROUND  0x10   //展开二进制00100000  
#define FLAG_SHOWOUTLINE 0x20   //展开二进制01000000 
#define FLAG_SHOWATEAGLE 0x40   //展开二进制10000000

(注:在C/C++中八进制以0开头,如0123(区别十进制的123);十六进制以0x开头,如0x40)
这样设置宏目的是为了能够应用位运算的性质来判断复选框的状态

假设用 int nStatus;来存储复选框的结果,可以这样做:

1.若某一个复选框选中则:nStatus=nStatus|FLAG_DUPLICATE;(其他类似)

2.那么如果取消了一个复选框呢?应该这样做:
  int mask=0xffffffff^FLAG_DUPLICATE;//(把FLAG_DUPLICATE中为"1"的那一位置为0,其它位都为1)
  nStatus=nStatus&mask;(其他类似)

3.如何判断某一复选框是否被选中呢?这样做:
  if(nStatus&FLAG_DUPLICATE==FLAG_DUPLICATE)
      cout<<"选中"<<endl;
  else
      cout<<"未选中"<<endl;

例子:

//取消复选框 
void __fastcall LayerInfo::SetVisible(bool bVisible)
{
    if(bVisible)
        m_nStatus=m_nStatus|FLAG_VISIBLE;
    else
{
        int mask = 0xffffffff^FLAG_VISIBLE;
        m_nStatus=m_nStatus&mask;
    }
    layer->Visible= bVisible;
}

//判断某一复选框是否被选中
if(m_nStatus&FLAG_SHOWOUTLINE==FLAG_SHOWOUTLINE)
    layer->Symbol->Outline=true;
else
    layer->Symbol->Outline=false; 还有一篇: http://blog.csdn.net/battlehawk/article/details/5271327 另外我写了一个简单的测试|(或运算)的例子,根据输出的结果,看出规律来了吧:

System.out.println(-1 | -1);   //输出 -1
System.out.println(-1 | 0);   //输出 -1
System.out.println(-1 | 1);   //输出 -1

System.out.println(0 | 0);   //输出 0
System.out.println(0 | 1);   //输出 1
System.out.println(0 | 2);   //输出 2

2011-12-31

Java: |(或运算) 与 多选判断的更多相关文章

  1. Java位运算总结:位运算用途广泛《转》

    前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...

  2. Java位运算原理及使用讲解

    前言日常开发中位运算不是很常用,但是巧妙的使用位运算可以大量减少运行开销,优化算法.举个例子,翻转操作比较常见,比如初始值为1,操作一次变为0,再操作一次变为1.可能的做法是使用三木运算符,判断原始值 ...

  3. Java位运算总结:位运算用途广泛

    前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...

  4. Java 位运算超全面总结

    1.原码.反码.补码 关于原码.反码.补码的相关知识作者不打算在这里长篇大论,相关知识已有别的大佬总结很好了,还请老铁自行 Google,不过有篇知乎回答是作者学编程以来见过对相关知识最通俗易懂,生动 ...

  5. 我们必须要了解的Java位运算(不仅限于Java)

    本文原创地址为 https://www.cnblogs.com/zh94/p/16195373.html 原创声明:作者:陈咬金. 博客地址:https://www.cnblogs.com/zh94/ ...

  6. Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range

    在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...

  7. js,java,浮点数运算错误及应对方法

    js,java浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2 ...

  8. java中字符串的非空判断

    问题如下:在java 中 字符串为null 如何判断String str;if(str==null) ??str.equal("null") ?? 答:我觉得应该搞清楚字符串对象和 ...

  9. 收藏的一段关于java大数运算的代码

    收藏的一段关于java大数运算的代码: package study_02.number; import java.math.BigDecimal; import java.math.BigIntege ...

随机推荐

  1. 一文让你完全弄懂Stegosaurus

    国内关于 Stegosaurus 的介绍少之又少,一般只是单纯的工具使用的讲解之类的,并且本人在学习过程中也是遇到了很多的问题,基于此种情况下写下此文,也是为我逝去的青春时光留个念想吧~ Stegos ...

  2. CrackMe-005全破详解(图文+源码)--上篇

    逆向破解 | 逆向 | 逆向分析 | CrackMe | Crack | CrackMe5 | CrackMe05 前言 CrackMe005,都说比较变态,很多人给放过去了,但是我还是决定上了它,既 ...

  3. 暴雪《争霸艾泽拉斯》*采用自适应 SSAO

    在实时渲染过程中,屏幕空间环境光遮蔽 (SSAO) 常用于打造小范围环境光效果和接触阴影效果.它用于许多现代游戏,通常占用 5% 到 10% 的帧时间.在<争霸艾泽拉斯>* 游戏开发过程中 ...

  4. 分布式监控系统Zabbix-3.0.3-新版微信报警(企业微信取代企业号)

    一般来说,Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是现在越来越多的企业开始使用zabbix结合微信作为主要的告警方式,这样可以及时有效的把告警信息推送到接收人 ...

  5. Linux系统入门教程:如何在 Linux 中修改默认的 Java 版本

    提问:当我尝试在Linux中运行一个Java程序时,我遇到了一个错误.看上去像程序编译所使用的Java版本与我本地的不同.我该如何在Linux上切换默认的Java版本? 当Java程序编译时,编译环境 ...

  6. C. Good Array

    链接 [https://codeforces.com/contest/1077/problem/C] 题意 给你一个数组,问你能去掉某个数使得剩下的数中某个数是其他数的和 输出个数以及他们的下标 分析 ...

  7. Final 个人最终作业。

    1.对软件工程M1/M2做一个总结 在M1阶段,我在C705组.M1阶段我与黄漠源同学结对,一起完成提取关键词算法的优化.最初我们一起测试提取关键词算法功能的实现效果,随后我主要负责从网络上搜寻并整理 ...

  8. 软件项目第一次Sprint总结

    成果评分表: 组名 分数 原因 9-652 6 界面和谐生动,可运行,在目前阶段可时间基本操作 hzsy -2 代码下载,但实现安卓和相机调用 JYJe族 -1 实现安卓界面,完成一项功能,做得少 结 ...

  9. PHP文件下载功能实现

    客户端的浏览器通过HTTP协议可以实现文件下载: 方法一: 能提供用户下载的最简单的方法就是使用一个<a></a>标签,比如在页面中添加这么一行代码 <a href=&q ...

  10. PAT L2-002 链表去重

    https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184 给定一个带整数键值的链表 L,你需要把其中绝 ...