C-fråga, bitmanipulation.

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Gimbal
Inlägg: 7872
Blev medlem: 20 april 2005, 15:43:53

C-fråga, bitmanipulation.

Inlägg av Gimbal »

Det var ett tag sedan jag knackade C så har visst blivit lite rostig.
Men det jag vill göra är att med en variabel (ex char n;) sätta ett antal bitar i en annan variabel, ex char k;

så med n=4 vill jag få resultat k = 00001111;
och med n=6 vill jag få resultat k = 00111111;

Med (1<<n ) får man ex 0000100, så inte helt bra.

Snabbt ska det gå också, dvs inga multiplikationer och dyligt.
Snabbfixen nu blev en array med färdiga resultat i...

Men finns det någon annan bra metod? :humm:
XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Re: C-fråga, bitmanipulation.

Inlägg av XorXaX »

Utan att ha testat, men kanske fungerar;
(0xff >> (8 - n))

.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: C-fråga, bitmanipulation.

Inlägg av Icecap »

Det snabbaste är nog just tabellen.

Det "snyggaste" är nog vad XorXaX beskriver - men hastigheten blir lidande om inte det finns en snabb shift-funktion i maskinkoden som direkt kan shifta ett valfritt antal steg.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: C-fråga, bitmanipulation.

Inlägg av Micke_s »

Kör tabell, är ju bara 8 värden..

Möjligtvis så skulle en switch case vara snabbare om kompilatorn optimerar det till jump-tabell..
Gimbal
Inlägg: 7872
Blev medlem: 20 april 2005, 15:43:53

Re: C-fråga, bitmanipulation.

Inlägg av Gimbal »

XorXaX skrev:Utan att ha testat, men kanske fungerar;
(0xff >> (8 - n))
Ja den var inte så dum. :tumupp:

(Blir nog ändå tabellen tills vidare, mest eftersom den redan är igång.)
mounte
Inlägg: 204
Blev medlem: 14 november 2010, 13:15:00
Ort: Sandviken

Re: C-fråga, bitmanipulation.

Inlägg av mounte »

Du var nästan helt rätt ute i din approach du behöver bara subtrahera 1
(1<<n) - 1
i princip lika som XorXaX
Gimbal
Inlägg: 7872
Blev medlem: 20 april 2005, 15:43:53

Re: C-fråga, bitmanipulation.

Inlägg av Gimbal »

Åh fy ¤"#% vad uppenbart!

Så här i efterhand, alltså.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: C-fråga, bitmanipulation.

Inlägg av BJ »

Snarare helt oläsligt... (Jo, jag ser vad som händer.)
Men det blir säkert snabbt.
Gimbal
Inlägg: 7872
Blev medlem: 20 april 2005, 15:43:53

Re: C-fråga, bitmanipulation.

Inlägg av Gimbal »

Bra kommentarer som beskriver varför man gör listiga manövrar är nödvändigt, annars sitter man som ett frågetecken ett år senare. Man kan se vad som händer, men varför man gör så är inte alltid lika uppenbart.

Som nu håller jag på och skiftar om data på både korsen och tvären för att förenkla för en interruptrutin som ska pwm upp till ca 40st LED individuellt. Det kommer säkert att gå bra, men jag fattar knappt det jag själv tänkt ut.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: C-fråga, bitmanipulation.

Inlägg av Micke_s »

Börjar nog bli dags att dokumentera implementationen..
Findecanor
Inlägg: 982
Blev medlem: 2 juli 2010, 23:04:07

Re: C-fråga, bitmanipulation.

Inlägg av Findecanor »

Oläsligt eller inte — det beror förstås på hur van man är vid bitmanipulation. ;)

Jag föreslår att man gör macron för sin bitmanipulation så blir det lättare att läsa koden.
Var också medveten om att << och >> har väldigt låg prioritet bland operatorerna så att man nästan alltid behöver ha paranteser runt dem... och man bör ha som vana att alltid ha paranteser runt parametrar till macron eftersom macron i C är lexikaliska.

Många 8-bitsprocessorer (AVR, 6502, z80) kan bara shifta ett steg i taget, så där kompileras en shift-operator till en loop om högerledet är en variabel. Där är tabeller ofta snabbare. På kraftfullare processorer (x86, ARM etc.) är det en enda instruktion oavsett värdet på högerledet.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: C-fråga, bitmanipulation.

Inlägg av BJ »

Gimbal och Findecanor: Sant. :)
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45167
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: C-fråga, bitmanipulation.

Inlägg av TomasL »

Jag föreslår att man gör macron för sin bitmanipulation så blir det lättare att läsa koden.
Ärligt talat, menar du allvar, macron borde vara fullständigt förbjudna, eftersom de inte går att debugga.

Om koden är svårläst, dokumentera istället.
Findecanor
Inlägg: 982
Blev medlem: 2 juli 2010, 23:04:07

Re: C-fråga, bitmanipulation.

Inlägg av Findecanor »

Hur då menar du att de inte går att debugga?

Jag brukar använda debuggers där jag stegar igenom en rad i koden i taget och kollar indata och utdata. Man bör inte skriva svåra konstiga macron. Macron bör vara enradare som gör så pass enkla saker att man inte ska behöva stega igenom dem. Jag tycker att det här är ett exempel på en rätt enkel sak men som annars är jobbig att skriva och där ett litet parantesfel kan bli ett stort fel. En perfekt sak för macron mao.

Om du inte vill använda macron, använd hellre en kompilator som tillåter inline-funktioner och som kan stänga av inlining. Om du har inlining avstängt när du debuggar så kan du stega igenom funktionen. Sen kan du sätta på inlining för produktions-bygget. Resultatet borde då bli lika snabbt som macron eller inget macro alls.
Men när man skriver kod för inbyggda system så kanske kompilatorn inte stödjer inlining och då får man använda macron.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45167
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: C-fråga, bitmanipulation.

Inlägg av TomasL »

Allting som inte är direkt utläsbart i koden är felaktigt, när du läser koden så skall du direkt, ihop med kommentarerna kunna följa koden, med makron så kan du inte på något sätt följa vad som händer.
En programmerare som använder makron är faktiskt en rätt dålig programmerare.
Eftersom han/hon är lat, eller saknar kunskap.
Preprocessorn skall möjligtvis användas för att sätta kompileringsdirektiv (om ens det), och konfigurera hårdvaran, inget annat.
Skriv svar