[C] koniunkcja bitowa, na czym polega?


(kijek) #1

Witam. Mój problem, czy raczej ciekawość, nie jest właściwie związana z językiem C, tylko z Arduino, którego język jest zasadniczo podobny do wspomnianego C. Ale przejdźmy do problemu. Otóż zbudowałem sobie prosty zegar na układzie DS1307 i zaprogramowałem go na podstawie kodu z _combustory.com_. Jednak w owym kodzie moją ciekawość wzbudziły następujące linijki:

I2C_WRITE(decToBcd(second) & 0x7f);

second = bcdToDec(I2C_READ() & 0x7f);

hour = bcdToDec(I2C_READ() & 0x3f);

Jaki jest sens zastosowania w tym przykładzie koniunkcji bitowej, skoro i tak zmienna przyjmie wartość z odczytu, lub do układu zostanie wysłana wartość wprowadzona przez użytkownika? O ile się nie mylę, będzie to wyglądało następująco:

I2C_WRITE(decToBcd(second) & 0x7f);

1111111|0x7f

  11100|0x1c

-------|----

  11100|



second = bcdToDec(I2C_READ() & 0x7f);

1111111|0x7f

 111011|0x3b

-------|----

 111011|


hour = bcdToDec(I2C_READ() & 0x3f);

 111111|0x3f

  11000|0x17

-------|----

  11000|

(w drugim wierszu każdej tabelki podana jest możliwa wartość, jaka może być przyjęta/wysłana).

Więc moje pytanie brzmi: jaki jest sens zastosowania koniunkcji bitowej w powyższym przykładzie i czy dobrze rozumiem koniunkcję bitową?


(kostek135) #2

Rozumiesz ją dobrze. Sens hmm załóżmy, że wczytałeś więcej niż 7 bitów

1111111

10110111

------------

 0110111

Zadziała to wtedy jak "ciacharka", skróci do siedmiu bitów pomijając bity bardziej znaczące we wczytanej zmiennej. Choć i to zależy od interpretacji, czy uzupełniamy 0 czy 1, ale bardziej logiczne i prawdopodobne wydaje się uzupełnianie 0.


(kijek) #3

Istotnie, we wspomnianym przez Ciebie przypadku - gdybym wczytywał więcej, niż 7 bitów, użycie koniunkcji bitowej miałoby sens. Problem w tym, iż w omawianych przypadkach nie da się wczytać więcej, jak 6 bitów. Dlatego nie rozumiem, dlaczego autor ją zastosował.