与&运算

0376的二进制就是1111 1110,二进制的与运算规则是,只有两个数同时为1时,则结果才为1,只要有一个数为0,则结果就为0。比如1&1=1; 1&0=0; 0&1=0; 0&0=0;因此把一个字符与二进制1111 1110进行与运算的结果就是把最后位设为0,而其他位不变。作个比喻假设a的二进制表示为1010 0111我们先不管这个数表示的是什么,我们来把这个数与1111 1110进行按位与运算,看看结果。

t_zset.c

#define ZSKIPLIST_MAXLEVEL 32 /* Should be enough for 2^32 elements */
#define ZSKIPLIST_P 0.25      /* Skiplist P = 1/4 */
int zslRandomLevel(void) {int level = 1;while ((random()&0xFFFF) < (ZSKIPLIST_P * 0xFFFF))level += 1;return (level<ZSKIPLIST_MAXLEVEL) ? level : ZSKIPLIST_MAXLEVEL;
}

0xFFFF=1111 1111 1111 1111

任何数和0xFFFF与运算其实就是暗含高位清零,低位与   结果就是一个0和65535之间的数

ZSKIPLIST_P * 0xFFFF=0.25*65535  肯定是比65535小   ,

所以系数ZSKIPLIST_P越小 ,((random()&0xFFFF) < (ZSKIPLIST_P * 0xFFFF))是1的可能就越大,就会继续while

(random()&0xFFFF) 本身就有50%的概率是0    0肯定小于ZSKIPLIST_P * 0xFFFF

$485 = 0
(gdb)
$486 = 1
(gdb)
$487 = 0
(gdb)
$488 = 1
(gdb)
$489 = 0
(gdb)
$490 = 0
(gdb)
$491 = 0
(gdb)
$492 = 0
(gdb)
$493 = 0
(gdb)
$494 = 1

10次有3次是1  30%的概率接近25%

类似的

zmalloc.c

#define update_zmalloc_stat_alloc(__n) do { \size_t _n = (__n); \if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \if (zmalloc_thread_safe) { \update_zmalloc_stat_add(_n); \} else { \used_memory += _n; \} \
} while(0)#define update_zmalloc_stat_free(__n) do { \size_t _n = (__n); \if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \if (zmalloc_thread_safe) { \update_zmalloc_stat_sub(_n); \} else { \used_memory -= _n; \} \
} while(0)

redis源码分析--zslRandomLevel位运算解析相关推荐

  1. Redis源码分析:基础概念介绍与启动概述

    Redis源码分析 基于Redis-5.0.4版本,进行基础的源码分析,主要就是分析一些平常使用过程中的内容.仅作为相关内容的学习记录,有关Redis源码学习阅读比较广泛的便是<Redis设计与 ...

  2. redis源码分析 -- cs结构之服务器

    服务器与客户端是如何交互的 redis客户端向服务器发送命令请求,服务器接收到客户端发送的命令请求之后,读取解析命令,并执行命令,同时将命令执行结果返回给客户端. 客户端与服务器交互的代码流程如下图所 ...

  3. Redis源码分析(一)redis.c //redis-server.c

    Redis源码分析(一)redis.c //redis-server.c 入口函数 int main() 4450 int main(int argc, char **argv) {4451 init ...

  4. 10年大厂程序员是如何高效学习使用redis的丨redis源码分析丨redis存储原理

    10年大厂程序员是怎么学习使用redis的 1. redis存储原理分析 2. redis源码学习分享 3. redis跳表和B+树详细对比分析 视频讲解如下,点击观看: 10年大厂程序员是如何高效学 ...

  5. Redis源码分析(一)--Redis结构解析

    从今天起,本人将会展开对Redis源码的学习,Redis的代码规模比较小,非常适合学习,是一份非常不错的学习资料,数了一下大概100个文件左右的样子,用的是C语言写的.希望最终能把他啃完吧,C语言好久 ...

  6. 【Nginx源码分析】Nginx配置文件解析(一)

    运营研发团队 李乐 配置文件是nginx的基础,对于学习nginx源码甚至开发nginx模块的同学来说更是必须深究.本文将从源码从此深入分析nginx配置文件的解析,配置存储,与配置查找. 看本文之前 ...

  7. 【Redis源码分析】Redis命令处理生命周期

    运营研发团队 李乐 前言 本文主要讲解服务器处理客户端命令请求的整个流程,包括服务器启动监听,接收命令请求并解析,执行命令请求,返回命令回复等,这也是本文的主题"命令处理的生命周期" ...

  8. Redis 源码分析之故障转移

    在 Redis cluster 中故障转移是个很重要的功能,下面就从故障发现到故障转移整个流程做一下详细分析. 故障检测 PFAIL 标记 集群中每个节点都会定期向其他节点发送 PING 消息,以此来 ...

  9. Redis源码分析 —— 发布与订阅

    前言 通过阅读Redis源码,配合GDB和抓包等调试手段,分析Redis发布订阅的实现原理,思考相关问题. 源码版本:Redis 6.0.10 思考问题 发布订阅基本概念介绍 订阅频道 -- SUBS ...

最新文章

  1. keil把源代码生成lib的方法
  2. SpringMVC实现文件的上传和下载
  3. STM32 电机教程 8 - 步进电机开环电流控制
  4. mysql5.6,基于GTID的主从同步与延迟复制
  5. 惨绝人寰的日期函数,用的方便
  6. linux四种集群是什么,lvs四种集群特点及使用场景
  7. C# 获取Excel中的合并单元格
  8. 《消息队列》函数讲解
  9. Linux——系统引导流程学习简单笔记
  10. 画图工具的认识及应用计算机,认知画图软件教学设计
  11. 【云周刊】第121期:图管够!灌篮高手、女儿国…阿里日,这帮程序员太会玩了!...
  12. C语言 3习题6 请编程序将China译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。 3习题7 设圆半径r=1.5
  13. 使用HttpURLConnection 越过ssl证书访问htts协议接口
  14. 1.DLL注入相关概念
  15. 打印、报表和文档-家谱树
  16. 怎样做竞品分析?竞品分析的意义?
  17. 2022年全球市场MEMS振荡器总体规模、主要生产商、主要地区、产品和应用细分研究报告
  18. 电商抖音直播带货SOP工作流程主播计划脚本方案
  19. 阿里云服务器安装指南
  20. linux中pl怎么使用教程,在Zynq-7000上编程PL的3种方法

热门文章

  1. TensorFlow(7)卷积神经网络实战(1)(可视化)
  2. R6010-abort() has been called,Error openning file ../../modules/highgui/src/cap_ffmpeg_impl.hpp解决方法
  3. Udacity机器人软件工程师课程笔记(二十一) - 对点云进行集群可视化 - 聚类的分割 - K-means|K均值聚类, DBSCAN算法
  4. 隐藏原生select下拉框的向下箭头▼
  5. 设置VSCode快捷键vue生成代码片段
  6. 【常用】细数那些常用的linux命令(只针对更新前端代码、上传文件到linux服务器)
  7. 在Oracle VM VirtualBox中如何安装64位虚拟机系统
  8. C# 篇基础知识11——泛型和集合
  9. Java面试题之多线程同步和互斥有几种实现方法,都是什么?
  10. [PKUWC2018]随机算法