Kirjoittaja Aihe: Miten luodaan numeroista pitkä bittijono?  (Luettu 151 kertaa)

Snufkin

  • Käyttäjä
  • Viestejä: 773
    • Profiili
Miten luodaan numeroista pitkä bittijono?
« : 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.
« Viimeksi muokattu: 23.11.25 - klo:21.15 kirjoittanut Snufkin »
Xubuntu 22.04 LTS, Fujitsu Lifebook E754

Snufkin

  • Käyttäjä
  • Viestejä: 773
    • Profiili
Vs: Miten luodaan numeroista pitkä bittijono?
« Vastaus #1 : 23.11.25 - klo:21.12 »
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.
Xubuntu 22.04 LTS, Fujitsu Lifebook E754

nm

  • Käyttäjä
  • Viestejä: 16853
    • Profiili
Vs: Miten luodaan numeroista pitkä bittijono?
« Vastaus #2 : 24.11.25 - klo:11.09 »
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

Snufkin

  • Käyttäjä
  • Viestejä: 773
    • Profiili
Vs: Miten luodaan numeroista pitkä bittijono?
« Vastaus #3 : 24.11.25 - klo:13.17 »
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
« Viimeksi muokattu: 24.11.25 - klo:13.24 kirjoittanut Snufkin »
Xubuntu 22.04 LTS, Fujitsu Lifebook E754