C-fråga, bitmanipulation.
C-fråga, bitmanipulation.
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?
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?
Re: C-fråga, bitmanipulation.
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.
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.
Re: C-fråga, bitmanipulation.
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..
Möjligtvis så skulle en switch case vara snabbare om kompilatorn optimerar det till jump-tabell..
Re: C-fråga, bitmanipulation.
Ja den var inte så dum.XorXaX skrev:Utan att ha testat, men kanske fungerar;
(0xff >> (8 - n))
(Blir nog ändå tabellen tills vidare, mest eftersom den redan är igång.)
Re: C-fråga, bitmanipulation.
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
(1<<n) - 1
i princip lika som XorXaX
Re: C-fråga, bitmanipulation.
Snarare helt oläsligt... (Jo, jag ser vad som händer.)
Men det blir säkert snabbt.
Men det blir säkert snabbt.
Re: C-fråga, bitmanipulation.
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.
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.
-
- Inlägg: 989
- Blev medlem: 2 juli 2010, 23:04:07
Re: C-fråga, bitmanipulation.
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.
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.
Re: C-fråga, bitmanipulation.
Ärligt talat, menar du allvar, macron borde vara fullständigt förbjudna, eftersom de inte går att debugga.Jag föreslår att man gör macron för sin bitmanipulation så blir det lättare att läsa koden.
Om koden är svårläst, dokumentera istället.
-
- Inlägg: 989
- Blev medlem: 2 juli 2010, 23:04:07
Re: C-fråga, bitmanipulation.
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.
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.
Re: C-fråga, bitmanipulation.
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.
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.