setbit命令對key所存儲的字符串值,設置指定偏移量上的比特位。
格式:
setbit key offset value
返回值: 返回指定偏移量原來存儲的位。
202011141941.png
如圖11-1所示,二進制串“abc”在內存中是以011000010110001001100011來表示的,現在字符串第9比特位的值為1,如果想設置此值為0,需要經過以下步驟。
- 判斷offset是否合法,一個字節占8位,一個字符串最大長度為512 MB,所以當offset/8大于512 MB時表示offset不合法。
- bit位只可能是0或1,當出現其他字符時不合法,on表示輸入的value值。
if (on & ~1) {
addReplyError(c,err);
return;
}
- 因一個字節占8個比特位,所以修改第offset個比特位,需要先取出第offset/8個字節,賦值為byteval,offset/8賦值為byte。例如,要修改第9個比特位,需要先取出第2個字節。
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。
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位賦值為新值便完成了字符串的設置比特位操作。
byteval &= ~(1 << bit); //1左移bit位,取反與原值相與,即將原值的低bit位賦值為0
byteval |= ((on & 0x1) << bit); //on&0x1的值為要修改后的值,左移bit位,與原值相或
((uint8_t*)o->ptr)[byte] = byteval;
標 題:《【Redis源碼】setbit命令》
作 者:zeekling
提 示:轉載請注明文章轉載自個人博客:小令童鞋