mysql中bit_count和bit_or使用

mysql中bit_count和bit_or使用,第1张

在看参考手册的时候看到个案例

3.6.8 Calculating Visits Per Day

首先要说明以下几个函数

bit_count:

就是计算二进制里有多少个1

10的二进制是1010

bit_count(10) = 2

100的二进制是1100100

bit_count(123) = 3

bit_or:

按位或,就是如果两边一个位置上存在1,那这个位置就为1

拿上面10和100举例

10 | 100 转换为二进制就是 1010|1100100

1010

1100100

1101110

1<<day:

向左位移,向左位移几位,然后用0填补

比如day=2

1<<2 = 100

day=4

1<<4 = 10000

回到主题,现在要计算出图中每天的访问量,可以看到day列中是存在重复记录的,所以要去除,一般思路应该会写出以下SQL:

这个的确可以得到正确值,但是官方参考文档里使用了更巧妙的算法

为了演示,现在将day设定为1,2,2,3好了,那就等于

bit_or(1<<1, 1<<2, 1<<2, 1<<3)

10 | 100 | 100 | 1000 =>110 | 100 | 1000 =>110 | 1000 =>1110

当110 | 100的时候,相同的值就不会发生变化,所以最后bit_count的结果就为3

插入2w条数据后,看下执行计划,第一种SQL执行两遍全表扫描

为了明确看到查询性能,我们启用profiling并关闭query cache:

兮兮_x

码龄1年

关注

4>>1, 表示4右移1位,就是相当于 4除2=2。

2<<1,表示2左移一位,就是不是相当于 2*2=4。

2<<3,表示2左移民3位,第三位就是相当于数值8,即,2*8=16

// 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1

var category = res.data.members[i].category

var items = that.data.items

for (var i = 0i <items.lengthi++) {

if (category &(1 <<i)) {

items[i].checked = true

}

}

that.setData({

items: items

})

console.log(that.data.items)

// 成员状态:0 待审核 1 允许加入 2:拒绝加入 3:退出中 (拒绝加入和退出中状态下的记录,3天后删除;需维护器维护)

/**

* @description 数字转二进制,查找对应名字显示

* @param {Number} num-传入的解析数字

* @return {Array}

*/

function findName(num) {

var name = ["小学辅导", "初中辅导", "高中辅导", "少儿英语", "幼儿早教", "国学教育", "语言培训", "美术培训", "音乐培训", "舞蹈培训", "体育运动", "书法培训", "棋类培训","能力训练", "托班辅导", "其它"]

var binary = parseInt(num).toString(2)

var length = 5 - (binary.length)

var s = ''

for (var i = 0i <lengthi++) {

s += '0'

}

var newNum = s + binary

var list = []

for (var i = 0i <newNum.lengthi++) {

list.push(newNum[i] != 0 ? name[newNum[i]] : null)

}

return list

}

打开CSDN,阅读体验更佳

php中左移和右移,为什么右移-1在PHP中总是给出-1?

按位移位运算符不会分裂.他们做他们应该做的事 – 转移位.特别是,右移 *** 作符执行以下 *** 作:>对于从右边开始的每个位,将其值设置为左侧的值>对于最左边的位,左边没有任何内容,保持其当前值例如,如果你的号码是1011...101右移给你11011...10因此,最右边的位(LSB)丢失,最左边的位(MSB)重复.这称为“符号传播”,因为MSB用于区分正(MSB = 0)和负(MSB = 1...

继续访问

java位运算左移<<、右移>>、无符号右移>>>

<<(左移),>>(右移)皆属于位运算符,运算比乘除快 <<(左移) 带符号位移,高位移出,低位补0,移动位数超过该类型的最大位数,则进行取模,如对Integer型左移34位,实际上只移动了两位。左移一位相当于乘以2的一次方,左移n位相当于乘以2的n次方。 例子1: 1<<4 1的二进制表示:0000 0001 1进行左移四位表示:0001 0000=2的4次方*1=16 所以1<<4的值是16 例子2: 1<<34 int型最大

继续访问

最新发布 二进制的左移和右移(方便理解)

二进制左移几位就是后面加几个0,前面去掉几位,负数的左移,跟正整数左移一样,右边补0,一直左移的话,最后就是0啦。举例说明:2

继续访问

左移,右移,无符号移动,原反补码

2的6次方 64 2的7次方 128 2的8次方 256 2的9次方 512 2的10次方 1024 2的11次方 2048 2的12次方 4096 2的13次方 8192 2的14次方 16384 左移: 12345 0000 0000 0000 0000‭ 0011 0000 0011 1001‬ <<1 左移一位 000 0000 0000 0000‭ 0011 0000 001...

继续访问

为什么二进制左移一位相当于乘以2

左移一位是0001 0000 0110,最高位不能去掉的,仔细想一下,原理很简单的,就比如一个十进制的数,例如2,左移一位,后面补0,就是20,,相当于乘以10,二进制的左移相当于乘以2,右移相当于除以2 ...

继续访问

二进制左移、右移

左移运算符:<< 用来将一个数的各二进制位全部左移若干位。例如:a<<2 表示,将a的二进制数左移2位,右补0。 高位溢出,舍弃。 比如16进制数:08 2进制为:0000 1000 08<<8左移8位2进制为:1000 00001、那:16进制的 0800 是多少呢?0x08=0...

继续访问

位运算——左移右移运算详解

代码 #include "stdio.h" char leftshift(char i, int n) { if(n <0) return -1return i<<n} char rightshift(char i, int n) { if(n <0) return -1return i>>n} int m

继续访问

位运算之左移右移运算之详解

先看如下一段左移右移的代码及其结果: 代码 #include "stdio.h"char leftshift(char i, int n){ if(n <0) return -1return i<<n}char rightshift(char i, int n){ if(n <0) return -1...

继续访问

算术左、右移位与逻辑左、右移位,右移一位和除二的区别、算术溢出

当你通过搜索逻辑,算术移位运算的时候,一直寻找资料,只不过可能你没有找到满意的回答,看到这,你大概率可以结束你的搜索过程了。 这里先说一句很重要的话: 正数的原码,反码,补码三者相同。 负数的反码就是该负数的绝对值(正数)的原码的所有位取反,负数的补码就是反码加一。 如果你想了解反码,原码,补码的定义还有补码为什么要+1,为什么补码比原码多表示一个数的话,你可以看我的另一篇文章《原码、反码、补码的知识总结》, 1.算术左移-逻辑左移 他们都遵循:高位丢弃,低位补零。 对于一个数字:00110011 算术

继续访问

热门推荐 算法(一):如何高效的算出2*8的值,位移算法原理解释,为什么8左移1位,4左移2位,2左移3位,1左移4位的结果为16

位移算法,如何高效的算出2*8的值,为什么8&ampamplt&ampamplt1,4&ampamplt&ampamplt2,2&ampamplt&ampamplt3,1&ampamplt&ampamplt4的结果为16,位移算法原理解释: 一个很重要的原因埋在前头:当初笔者刚出来面试遇到这道题也曾是一脸懵逼,后来查了很多相关资

继续访问

解析Python中的二进制位运算符

下表列出了所有的Python语言的支持位运算符。假设变量a持有60和变量b持有13,则: 示例: 试试下面的例子就明白了所有的Python编程语言提供了位运算符: #!/usr/bin/python a = 60 # 60 = 0011 1100 b = 13 # 13 =...

11.JS运算符-二进制位运算符

二进制位运算符 概述 二进制位运算符用于直接对二进制位进行计算,一共有7个。 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1。 二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果为1,否则为0。 二进制否运算符(not):符号为~,表示对一个二进制位取反。 异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。 左移运算符(left shift):符号为<<,详见下文解释。 右移运算符(right shift

继续访问

计算机二进制运算符,二进制运算符

概述作用速度块都作用于32位整数二进制位运算符用于直接对二进制位进行计算,一共有7个。二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1。二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果为1,否则为0。二进制否运算符(not):符号为~,表示对一个二进制位取反。异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。...

继续访问

二进制位运算符

概述 二进制位运算符用于直接对二进制位进行计算,一共有7个。 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1。 二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果为1,否则为0。 二进制否运算符(not):符号为~,表示对一个二进制位取反。 异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。 左移运算符(left shift):符号为<<,详见下文解释。 右移运算符(right shift):

继续访问

mysql 二进制函数_MySQL涉及二进制的运算符:位运算符

截止目前我们已经学习了MySQL的三种运算符:算术运算符、比较运算符、逻辑运算符。三者有一个共同点都是针对字符型、表达式和十进制的数字。那有没有一种专门为二进制数字提供的运算符呢?这就是本问题的主题:位运算符。先看看位运算符的定义:位运算符用来对二进制字节中的位进行位移或者测试处理,MySQL中提供的位运算符有按位或(|)、按位与(&)、按位异或(^)、按位左移(<>)、按位取...

继续访问

左移和右移运算

C语言里的左移和右移运算 转自:http://www.cppblog.com/tx7do/archive/2006/10/19/13867.html 1、先说左移, 左移就是把一个数的所有位都向左移动若干位,在C中用 int i = 1i = i 也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0

继续访问

【python--教程】二进制运算符

前言 计算机发明之初就是为了计算数字,编程语言就是为了更好的利用计算机进行数字计算的。python作为一个偏向于运算的编程语言,自然也少不了数字运算。 本次我们将学习python中关于二进制的运算的部分。 前提摘要 1.十进制转二进制 函数介绍:bin()函数用于将十进制数字转化为二进制数字 用法:bin(十进制数字) 例如计算十进制100的二进制数据 bin(100) 结果 '0b11001...

继续访问

java 二进制与运算符

二进制 十进制 1 2 4 8 16 32 二进制 1 10 100 1000 10000 100000 图1 图1是做进制运算时候,方便计算的一...

继续访问

javaScript——二进制位运算符

概述 二进制位运算符用于直接对二进制位进行计算,一共有7个。 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1。 二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果为1,否则为0。 二进制否运算符(not):符号为~,表示对一个二进制位取反。 异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。 左移...

继续访问

【python】数据类型4-二进制与二进制运算符

二进制与二进制运算符,包含二进制基础概念,二进制基础运算符运算,进阶版后续附上链接

继续访问

html5

css3

写评论

评论

1

1


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7280572.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存