bitcount start end Count is not correct,new command,As follows
info
Server
redis_version:2.6.2
redis 127.0.0.1:138> setbit test1 10 1 (integer) 0 redis 127.0.0.1:138> setbit test1 20 1 (integer) 0 redis 127.0.0.1:138> setbit test1 30 1 (integer) 0 redis 127.0.0.1:138> bitcount test1 (integer) 3 redis 127.0.0.1:138> bitcount test1 1 9 (integer) 3 redis 127.0.0.1:138> bitcount test1 1 19 (integer) 3 redis 127.0.0.1:138> bitcount test1 18 19 (integer) 0 redis 127.0.0.1:138> bitcount test1 18 29 (integer) 0 redis 127.0.0.1:138> bitcount test1 8 29 (integer) 0 redis 127.0.0.1:138> bitcount test1 8 10000 (integer) 0 redis 127.0.0.1:138> bitcount test1 1 10000 (integer) 3 redis 127.0.0.1:138> bitcount test1 2 10000 (integer) 2 redis 127.0.0.1:138> bitcount test1 3 10000 (integer) 1 redis 127.0.0.1:138> bitcount test1 4 10000 (integer) 0
Comment From: charsyam
@xx007 What is wrong?
setbit sets bit with bitoffset. but bitcount's offset means byte offset.
offset starts from 0
"setbit test1 10 1" means 00000000 00100000, so it is set in byte offset 1 "setbit test1 20 1" means 00000000 00000000 00001000, so it is set in byte offset 2 "setbit test1 30 1" means 00000000 00000000 00000000 00000010, so it is set in byte offset 3
finally, "bitcount test1 1 3" has to return 3.
so. bitcount works correctly.
Comment From: xx007
"setbit test1 10 1" means 00000000 00100000, so it is set in byte offset 1 "setbit test1 20 1" means 00000000 00100000 00001000, so it is set in byte offset 2 "setbit test1 30 1" means 00000000 00100000 00001000 00000010, so it is set in byte offset 3
redis 127.0.0.1:138> bitcount test1 1 9 (integer) 3 redis 127.0.0.1:138> bitcount test1 1 19 (integer) 3 redis 127.0.0.1:138> bitcount test1 18 19 (integer) 0 redis 127.0.0.1:138> bitcount test1 18 29 (integer) 0 redis 127.0.0.1:138> bitcount test1 8 29 (integer) 0 redis 127.0.0.1:138> bitcount test1 8 10000 (integer) 0 redis 127.0.0.1:138> bitcount test1 1 10000 (integer) 3 redis 127.0.0.1:138> bitcount test1 2 10000 (integer) 2 redis 127.0.0.1:138> bitcount test1 3 10000 (integer) 1 redis 127.0.0.1:138> bitcount test1 4 10000 (integer) 0
bitcount start 1 end 10000 count is 3? bitcount start 2 end 10000 count is 2? bitcount start 3 end 10000 count is 1? bitcount start 4 end 10000 count is 0?
why?thanks
Comment From: charsyam
@xx007 yes. it is easy to misunderstand because bitcount and setbit, getbit hasve different semantic.
setbit, getbit use bit offset, and bitcount uses byte offset.
"setbit test1 10 1" means 00000000 00100000, so it is set in byte offset 1 "setbit test1 20 1" means 00000000 00100000 00001000, so it is set in byte offset 2 "setbit test1 30 1" means 00000000 00100000 00001000 00000010, so it is set in byte offset 3
"setbit test1 10 1" means setting 11th bit to 1( index is from 0 ) 11th bit is in 2nd byte. 21th bit is in 3nd byte. 31th bit is in 4nd byte.
"bitcount start 1 end 10000" count from 2nd byte to 10001th byte. so it should return 3 "bitcount start 2 end 10000" count from 3nd byte to 10001th byte. so it should return 2 "bitcount start 3 end 10000" count from 2nd byte to 10001th byte. so it should return 1
thank you.
Comment From: xx007
thanks.I got it
"setbit test1 30 1" means 00000000 00100000 00001000 00000010
but getbit no start end
I want to bitcount is bit,not byte
explame: bitcount start 15 end 10000
return 15bit to 10000bit result is 2 (000 00001000 00000010)
bit convert to byte,then bitcount?
Other methods?????Other command?????
thanks.
Comment From: maketubo
https://redislabs.com/redis-best-practices/counting/bit-counting-pattern/ This blog also very confusing