setbit命令對key所存儲的字符串值蕊程,設置指定偏移量上的比特位局装。
格式:
setbit key offset value
返回值: 返回指定偏移量原來存儲的位。
202011141941.png
如圖11-1所示摩幔,二進制串“abc”在內存中是以011000010110001001100011來表示的浊猾,現在字符串第9比特位的值為1,如果想設置此值為0热鞍,需要經過以下步驟。
- 判斷offset是否合法,一個字節(jié)占8位薇宠,一個字符串最大長度為512 MB偷办,所以當offset/8大于512 MB時表示offset不合法。
- bit位只可能是0或1澄港,當出現其他字符時不合法椒涯,on表示輸入的value值。
if (on & ~1) {
addReplyError(c,err);
return;
}
- 因一個字節(jié)占8個比特位回梧,所以修改第offset個比特位废岂,需要先取出第offset/8個字節(jié),賦值為byteval狱意,offset/8賦值為byte湖苞。例如,要修改第9個比特位详囤,需要先取出第2個字節(jié)财骨。
byte = bitoffset >> 3;//一個字節(jié)是8位,現在需要除以8藏姐,以定位到第byte個字節(jié)上
byteval = ((uint8_t*)o->ptr)[byte];//取出第byte個字節(jié)
- 當取出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相或可以得出新的字節(jié)的值卵皂,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
提 示:轉載請注明文章轉載自個人博客:小令童鞋