Jak sama nazwa wskazuje, SETBIT
pozwala na wykonywanie operacji na bitach - mianowicie ustawienie danego bitu na 0 lub 1, przy danym przesunięciu bitu, dla danego klawisza.
Ważne jest, aby zrozumieć, że wynik nie zawsze zawiera tylko znaki, które można wydrukować. Dlatego Redis używa niestandardowej funkcji sdscatrepr
aby sformatować wyjście CLI:
Dołącz do ciągu sds „s” ciąg znaków ze znakami ucieczki, w którym wszystkie niedrukowalne znaki (testowane za pomocą isprint()) są zamieniane na znaki specjalne w postaci „\n\r\a...” lub „\x” .
Biorąc to pod uwagę, zacznijmy od prostego przykładu. Jeśli weźmiesz pod uwagę liczbę szesnastkową 0x7F
(=127) jego binarna reprezentacja na 8-bitach to:
pos: 0 1 2 3 4 5 6 7
bit: 0 1 1 1 1 1 1 1
^ ^
| |
MSB LSB
Zazwyczaj możesz użyć SETBIT
aby zapisać tę wartość, pamiętając, że przesunięcie 0
to MSB
a offset 7 to LSB
:
redis> SETBIT myval 0 0
(integer) 0
redis> SETBIT myval 1 1
(integer) 0
redis> SETBIT myval 2 1
(integer) 0
redis> SETBIT myval 3 1
(integer) 0
redis> SETBIT myval 4 1
(integer) 0
redis> SETBIT myval 5 1
(integer) 0
redis> SETBIT myval 6 1
(integer) 0
redis> SETBIT myval 7 1
(integer) 0
Sprawdź swoją wartość, jeśli:
redis> GET myval
"\x7f"
Co się dzieje z wieloma bajtami? Załóżmy, że chcesz przechowywać 0x52
(=82), co odpowiada znakowi R
w ASCII. Reprezentacja 8-bitowa to 01010010
z pozycjami bitów (8, 9, ..., 15)
ponieważ chcemy, aby była przechowywana zaraz po pierwszej wartości:
redis> SETBIT myval 8 0
(integer) 0
redis> SETBIT myval 9 1
(integer) 0
redis> SETBIT myval 10 0
(integer) 0
redis> SETBIT myval 11 1
(integer) 0
redis> SETBIT myval 12 0
(integer) 0
redis> SETBIT myval 13 0
(integer) 0
redis> SETBIT myval 14 1
(integer) 0
redis> SETBIT myval 15 0
(integer) 0
I otrzymujesz:
redis> GET myval
"\x7fR"
Tutaj Redis CLI może reprezentować drukowalny znak R
.
Kiedy zapisuję ciąg wartości 1 i 7 w „mykey”
Odpowiada 01000001
co jest równe 65 i 0x41
w szesnastkach. Odpowiada znakowi ASCII A
. Robię to:
redis> SETBIT mykey 1 1
(integer) 0
redis> SETBIT mykey 7 1
(integer) 0
Daje:
redis> GET mykey
"A"
jak działa getbit w redis?
Po prostu zwraca wartość bitu w danej pozycji. Tutaj:
redis> GETBIT mykey 1
(integer) 1
Ale bit 0 nie został ustawiony (domyślnie jest to 0), więc:
redis> GETBIT mykey 0
(integer) 0