Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: Snufkin - 23.11.25 - klo:21.10
-
Olisi tällainen tarve, mutta oma C-kielen taito vielä varsin vajavainen. Eli pitäisi puristaa joukko numeroita yhdeksi binääripötköksi. Esim.
55 - 110111 - 6 bittiä
2678 - 101001110110 - 12 bittiä
2 - 10 - 2 bittiä
15 - 1110 - 4 bittiä
Lopputulos: 24 bittiä, eli 3 tavua.
110111_101001110110_10 _1110
110111101001110110101110
11011110 10011101 10101110
0x DE 9D AE
Lähtöarvot siis aina desimaaleja ja niillä vakiopituus (bitteinä). Lopputulos n*tavua ja voidaan kirjoittaa hexoina.
Miten tuollaista kannattaisi alkaa työstämään. Lopputulos saattaa olla 10-20 tavua, eli mikään vakio long int tms. ei käy datajonon pohjaksi. Toimisiko char array[n] tai joku vastaava taulukkomainen datatyyppi? Tässä tosin sitten ongelma, että kun bittejä siirtää >> operaatiolla, niin eivät kai liu'u taulukossa eteenpäin vaan käsitellään char kerrallaan.
En kaipaa valmista ratkaisua, vaan idea minkä pohjalle tuota lähtisi rakentamaan. Ei saa käyttää mitään eksoottisia funktioita tms. kun tulee sulautettuun laitteeseen.
-
Yksi tapa voisi olla sellainen, että luodaan ensin int (tai long int) ja siihen ympätään bittioperaatiolla muutama lukuarvo. Sitten siitä kopiodaan viimeinen tavu tuollaiseen arrayhun, ja sitten >> 8 ja taas kopioidaan ko. inttiin lisää. Tämä kuitenkin melko mutkikas.
-
Tähän on mahdollista käyttää bitfield-tyyppistä structia, jos tallennettavilla arvoilla on vakiopituus. Bitfieldin tavujen sisäinen järjestys ei tosin ole tiukasti määritelty C-standardissa, vaan riippuu kääntäjästä ja mahdollisesti siitä, onko kyseessä little-endian vai big-endian-arkkitehtuuri. Niinpä tuloksen listaaminen tavuittain on toteutettava joko:
1. kääntäjäkohtaisesti, jolloin bitfield-tyyppinen struct voidaan peilata tavuiksi union-rakenteen avulla tai sijoittamalla structin osoitin char-taulukon osoittimeen tai
2. koostamalla tavut manuaalisesti yhdistelemällä tallennettuja arvoja bittioperaatioilla.
Katso:
https://en.wikipedia.org/wiki/Bit_field
https://jkz.wtf/bit-field-packing-in-gcc-and-clang
https://icarus.cs.weber.edu/~dab/cs1410/textbook/5.Structures/unions.html
-
Tuo bitfield on mielenkiintoinen. On minulle uusi tuttavuus ja katselin pari videota aiheesta. Nyt pitää tutkia/kokeilla saisiko sillä etua verrattuna suoraan bittioperaatoiden käyttöön.
Pähkäilin eilen, ettei tuo suorakaan olisi mahdottoman vaikea. Sen voisi toteuttaa niin, että ensin tallentaa lähtoarvon int-muuttujaan ja sitten kopio niistä viimeisen tavun vaikkapa char-arrayhyn. Jos jää vajaaksi, niin seuraavasta arvosta kopiodaan sinne loput bittimaskin avulla.
Oivalsin, että jos
int muuttuja = 0b 00000000 0000000 00001111 111111
niin
(char)muuttuja = 1111111.
Eli tuo (char)-tyyppimuunnos ikään kuin leikkaa int'stä 24 ekaa bittiä pois. Tuolla tavalla pääsee helposti käsiksi tuohon viimeiseen tavuun.
Sitten muuttuja >> 8 ja pääsee käsiksi int'n 3. tavuun, jne.
eli muuttuja olisi: 0b 00000000 00000000 0000000 00001111