Sida 1 av 2

C-fråga, bitmanipulation.

Postat: 15 juni 2018, 10:27:01
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:

Re: C-fråga, bitmanipulation.

Postat: 15 juni 2018, 10:35:06
av XorXaX
Utan att ha testat, men kanske fungerar;
(0xff >> (8 - n))

.

Re: C-fråga, bitmanipulation.

Postat: 15 juni 2018, 10:40:52
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.

Re: C-fråga, bitmanipulation.

Postat: 15 juni 2018, 12:08:32
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..

Re: C-fråga, bitmanipulation.

Postat: 15 juni 2018, 12:37:06
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.)

Re: C-fråga, bitmanipulation.

Postat: 15 juni 2018, 13:31:33
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

Re: C-fråga, bitmanipulation.

Postat: 15 juni 2018, 13:38:39
av Gimbal
Åh fy ¤"#% vad uppenbart!

Så här i efterhand, alltså.

Re: C-fråga, bitmanipulation.

Postat: 15 juni 2018, 15:08:28
av BJ
Snarare helt oläsligt... (Jo, jag ser vad som händer.)
Men det blir säkert snabbt.

Re: C-fråga, bitmanipulation.

Postat: 15 juni 2018, 15:33:10
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.

Re: C-fråga, bitmanipulation.

Postat: 15 juni 2018, 16:11:49
av Micke_s
Börjar nog bli dags att dokumentera implementationen..

Re: C-fråga, bitmanipulation.

Postat: 15 juni 2018, 16:16:39
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.

Re: C-fråga, bitmanipulation.

Postat: 15 juni 2018, 19:55:08
av BJ
Gimbal och Findecanor: Sant. :)

Re: C-fråga, bitmanipulation.

Postat: 15 juni 2018, 21:12:44
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.

Re: C-fråga, bitmanipulation.

Postat: 15 juni 2018, 21:40:27
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.

Re: C-fråga, bitmanipulation.

Postat: 15 juni 2018, 21:46:54
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.