异或运算、与运算、或运算 运用在 多项选择题

原文:异或运算、与运算、或运算 运用在 多项选择题

背景

当我们有个需求,有一个多项选择题的答案保存到数据库。

我们按照一般的思维,就是做多几个字段去存这些多项选这题。

例子

例如:

有一个多项选择题,

问题:你觉得广东哪些城市好玩?

A.东莞市

B.广州市

C.中山市

D.珠海市

E.茂名市

F.深圳市

按照一般思维,我们在数据库中设计6个字段,A/B/C/D/E/F,然后保存在数据库,谁选择了A,就把A对应的字段值存入数据库。

比如,我选择了B/C/D,表数据如下:

  FieldA FieldB FieldC FieldD FieldE FieldF  
  0 1 1 1 0 0  

这样虽然清楚,但是浪费表资源的同时,当数据量多,造成查询数据低下的效果。

异或

下面,我们来介绍,如何用异或来存多项选择题。

我们首先定义选择题答案的枚举:

   //城市枚举
    public enum CityPlay
    {
        DongGuang = 1 << 0,//东莞
        GuangZhou = 1 << 1,//广州
        ZhongShan = 1 << 2,//中山
        ZhuHai = 1 << 3,//珠海
        MaoMing = 1 << 4,//茂名
        ShenZheng = 1 << 5//深圳
    }

在表中,我们只存一个字段(整型)

Field

如果,选择了B/C/D,做B/C/D的按位或运算,存入数据库:

CityPlay.GuangZhou | CityPlay.ZhongShan | CityPlay.ZhuHai

值等于14,存入数据库。

那我们怎么知道用户选择了哪几个题呢?

很简单,做或运算,

比如是否选择了B? 很简单,把值与B的枚举做一次按位与运算,等于0就是没选择,其余选择
CityPlay.GuangZhou & 14 == 0? N:Y

其他选项以此类推。

原文地址:https://www.cnblogs.com/lonelyxmas/p/10217520.html

时间: 2024-08-30 06:08:55

异或运算、与运算、或运算 运用在 多项选择题的相关文章

位运算计算与位运算应用

位运算包括与,或,取反,异或,左移,右移等. 一 位运算计算 1 与运算:& 操作符&将2个数的二进制位进行与操作,2个数对应的位都为1,运算结果为1:否则运算结果为0. 比如 6&8,6的二进制为:0110   8的二进制为:1000.所以6&8 = 0000 = 0 2 或运算:| 操作符|将2个数的二进制位进行或操作,2个数对应的位有一个为1,运算结果为1:否则运算结果为0. 比如 6&8,6的二进制为:0110   8的二进制为:1000.所以6&8

编程题:自增运算与自减运算的运用

#include<stdio.h> void main() {int a1,a2,a3,a4,b1,b2,b3,b4; a1=a2=a3=a4=10; b1=(a1++)+(a1++)+(a1++); b2=(++a2)+(++a2)+(++a2); b3=(a3--)+(a3--)+(a3--); b4=(--a4)+(--a4)+(--a4); printf("a1=%d,a2=%d,b1=%d,b2=%d\n",a1,a2,b1,b2); printf("a

java学习第13天( java获取当前时间,有关大数据的运算及精确数字运算,Date类)

一 java获取当前时间 学习一个函数,得到当前时间的准确值 System.currectTimeMillis(). 可以得到以毫秒为单位的当前时间.它主要用于计算程序运行时间,long start=System.currectTimeMillis() ,long stop=System.currectTimeMillis() , stop-start; 二  有关大数据的运算及精确数字运算. 此时integer不适用.我们使用BigInteger ,如:BigInteger B= new Bi

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

前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天系统研究了下,现记录如下. 首先要明白一个概念,Java位运算是针对于整型数据类型的二进制进行的移位操作.主要包括位与.位或.位非,有符号左移.有符号右移,无符号右移等等.需要注意一点的是,不存在无符号左移<<<运算符.根据位运算的概念规定,我们首先需要弄明白两个问题,java有哪些数据类型

[转]取模运算和求余运算的区别

[转]取模运算和求余运算的区别 通常情况下取模运算(mod)和求余(rem)运算被混为一谈,因为在大多数的编程语言里,都用'%'符号表示取模或者求余运算.在这里要提醒大家要十分注意当前环境下'%'运算符的具体意义,因为在有负数存在的情况下,两者的结果是不一样的. 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c*b. 通常常用的是正数之间取模或求余.下面的可以先不关心. —————————————————————

从去除毛刺的策略看开运算opening_circle和闭运算closing_circle的异同

从去除毛刺的策略看开运算opening_circle和闭运算closing_circle的异同 例一:毛刺在往外凸的面上 策略1:分割出黑色部分,然后通过开运算去掉毛刺,再通过原黑色部分区域减去开运算之后的区域,得到毛刺部分的区域. 1 read_image (Tu, 'C:/Users/xiahui/Desktop/tu.jpg') 2 binary_threshold (Tu, Region, 'max_separability', 'dark', UsedThreshold) 3 open

Python 基础学习之: Python math 模块、cmath 模块 区别是 cmath 模块运算的是复数,math 模块运算的是数学运算 Python数学函数列表及解释 Python math 模块提供了许多对浮点数的数学运算函数。 Python cmath 模块包含了一些用于复数运算的函数

Python math 模块.cmath 模块 Python 中数学运算常用的函数基本都在 math 模块.cmath 模块中. Python math 模块提供了许多对浮点数的数学运算函数. Python cmath 模块包含了一些用于复数运算的函数. cmath 模块的函数跟 math 模块函数基本一致,区别是 cmath 模块运算的是复数,math 模块运算的是数学运算. 要使用 math 或 cmath 函数必须先导入: import math 查看 math 查看包中的内容: impo

Math——取模运算及取余运算

取模运算及取余运算 取余运算(Complementation)即我们小学时学的数学算术概念,而取模运算(Modulus Operation)常用于程序设计中 公式 a%b = a - (a/b * b) 取整运算 要明白取模运算和取余运算之间的区别,首先要了解取整运算(Round Operation) 取整运算常用的有三种,向负无穷取整,向正无穷取整,向零取整 以lua语言为例,lua的math数学库提供三个取整函数,floor向负无穷取整,ceil向正无穷取整,modf向零取整 (PS:lua

leetcode算法题1: 两个二进制数有多少位不相同?异或、位移、与运算的主场

/*The Hamming distance between two integers is the number of positions at which the corresponding bits are different. Given two integers x and y, calculate the Hamming distance. Note:0 ≤ x, y < 231. Example: Input: x = 1, y = 4 Output: 2 Explanation:

高精度运算专题3-乘法运算(The multiplication operation)

这个专题呢,我就来讲讲高精度的乘法,下面是三个计算乘法的函数,第一个函数是char类型的,要对字符串进行数字转换,而第二个是两个int类型的数组,不用转换成数字,第三个则更为优化,用a数组-b数组放回数组a里面 函数1思路:要先把char类型的转换成int类型的数,直接每个数-‘0’就可以实现把char类型的转换成int类型的了. ①记录数组a.数组b的长度,放到第一位 ②每个位相乘,用一个数来记录进位(初值为0),每个位相乘,加上进位,存入c数组的相对应的位置,每次进位要重新赋值 ③最后记得要