前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Redis源码】setbit命令

【Redis源码】setbit命令

作者头像
zeekling
发布2022-08-26 19:33:34
3920
发布2022-08-26 19:33:34
举报
文章被收录于专栏:浪浪山下那个村

setbit命令对key所存储的字符串值,设置指定偏移量上的比特位。

格式:

代码语言:javascript
复制
setbit key offset value

返回值: 返回指定偏移量原来存储的位。

202011141941.png
202011141941.png

如图11-1所示,二进制串“abc”在内存中是以011000010110001001100011来表示的,现在字符串第9比特位的值为1,如果想设置此值为0,需要经过以下步骤。

  • 判断offset是否合法,一个字节占8位,一个字符串最大长度为512 MB,所以当offset/8大于512 MB时表示offset不合法。
  • bit位只可能是0或1,当出现其他字符时不合法,on表示输入的value值。
代码语言:javascript
复制
if (on & ~1) {
        addReplyError(c,err);
        return;
    }
  • 因一个字节占8个比特位,所以修改第offset个比特位,需要先取出第offset/8个字节,赋值为byteval,offset/8赋值为byte。例如,要修改第9个比特位,需要先取出第2个字节。
代码语言:javascript
复制
byte = bitoffset >> 3;//一个字节是8位,现在需要除以8,以定位到第byte个字节上
byteval = ((uint8_t*)o->ptr)[byte];//取出第byte个字节
  • 当取出byteval之后,需要判断原字符串第offset位上的值,供命令的返回值使用。将offset对8取模赋值为bit,bit表示byteval的从低位数第bit位。byteval与bit相与的结果如果大于0表示原比特为1,等于0表示原比特为0。
代码语言:javascript
复制
bit = 7 - (bitoffset & 0x7); //offset对8取模
    bitval = byteval & (1 << bit); //1<<bit位表示将1从低位向左移bit位,获取到第bit位
  • 修改比特位的值。将byteval的从低位数第bit位强制赋值为1。on&0x1的值结果只能为0x1或0x0,将其左移bit位与byteval相或可以得出新的字节的值,o的第byte位赋值为新值便完成了字符串的设置比特位操作。
代码语言:javascript
复制
byteval &= ~(1 << bit); //1左移bit位,取反与原值相与,即将原值的低bit位赋值为0
    byteval |= ((on & 0x1) << bit); //on&0x1的值为要修改后的值,左移bit位,与原值相或
    ((uint8_t*)o->ptr)[byte] = byteval;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020.11.14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档