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!
