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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)