Sida 1 av 1

[Arduino] Pointer operator?

Postat: 4 december 2011, 15:36:23
av SpanCox
Jag skulle behöva hjälp med att uttyda vad " & 0x1f " gör i exemplet nedan.

Jag tror mig ha förstått att det är en pointer operator, med vad en sådan gör och framför allt vad den tillför i mitt exempel nedan tycks mig väl förborgat.

Kod: Markera allt

buttonCounter1 = 8
const byte brightnessLookup1 [] = {0, 1, 4, 9, 14, 20, 27, 35, 44, 55, 69, 86, 107, 133, 165, 206, 255};

outputValue1 = brightnessLookup1 [buttonCounter1 & 0x1f] ;
outputValue2 = brightnessLookup1 [buttonCounter1] ;
Värdena blir ju 35 i båda fallen, så vad är det för magiskt som " & 0x1f "skall utföra?

Re: [Arduino] Pointer operator?

Postat: 4 december 2011, 15:39:39
av Micke_s
0x1f tar ut de 5 lägsta bitarna bara, antagligen för att inte gå utanför tabellen. Fast det hjälper ju inte riktigt eftersom det är mindre än 32 (2^5) värden i tabellen.

Om du har en tabell som har antal värden jämt delbart med 2^i så kan du köra en räknare som slår "runt" så att säga tidigare än vad hela 8 bits talet gör.

exempel, tabell med 2^3 värden (8 st)

table[] = {0, 1, 2, 3, 4, 5, 6, 7};
cnt++;
output = table[cnt & (2^3-1)];

Re: [Arduino] Pointer operator?

Postat: 4 december 2011, 15:51:57
av sodjan
Och bara för att förtydliga så har det inte ett smack med "pointers" att göra.

Re: [Arduino] Pointer operator?

Postat: 4 december 2011, 15:58:17
av Micke_s
tack sodjan: glömde bort medans jag skrev vad rubriken var.

Re: [Arduino] Pointer operator?

Postat: 4 december 2011, 16:00:22
av Icecap
I C kan det vara ganska svårt att veta men '&' är logisk AND på bit-nivå, '&&' är logisk AND på "heltalsnivå" - men i andra sammanhang kan det betyda "Adressen på vaddetnuär", alltså en pointer.

Den rätta betydelse beror på sammanhanget och i detta fall är det fullständigt korrekt vad Micke_s och sodjan skriver.

Re: [Arduino] Pointer operator?

Postat: 4 december 2011, 21:28:10
av SpanCox
Micke_s skrev:0x1f tar ut de 5 lägsta bitarna bara, antagligen för att inte gå utanför tabellen. Fast det hjälper ju inte riktigt eftersom det är mindre än 32 (2^5) värden i tabellen.

Om du har en tabell som har antal värden jämt delbart med 2^i så kan du köra en räknare som slår "runt" så att säga tidigare än vad hela 8 bits talet gör.

exempel, tabell med 2^3 värden (8 st)

table[] = {0, 1, 2, 3, 4, 5, 6, 7};
cnt++;
output = table[cnt & (2^3-1)];
Tack för ett mycket utförligt och kompetent svar! :tumupp: