Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Binäärilukujen yhteen- ja vähennyslasku

Sivun loppuun

Jere Sumell [16.03.2021 14:55:43]

#

(Moderaattori siirsi viestin Tietokoneen luvut -oppaan kommentista.)

Voisiko olla mahdollista, että joku vaikka kommentteihin lisäisi binäärilukujen yhteen ja vähennyslaskun esimerkit sekä tilanteessa, jossa tulee ylivuoto ja miinuslaskusta kynä/paperi -menetelmällä, jossa tapahtuu ylivuoto.

Yhteenlaskut ei sinänsä tuota ongelmia, mutta jos on vähennyslasku, menen kääntämään kaikki nollat ykkösiksi ja ykköset nolliksi vähentäjästä, ja sitä mukaa lopputulos on väärä.

Kahden komplementtiluvut, mitä tietokone käsittelee, niin -0 on siinä poissuljettu, niin jos kääntää miinuslaskussa vähentäjän ja lisää yhden, tajuan tämän, mutta en osaa silti laskea käytännössä oikein. Lukusykli - käsite on tuttu, mitä noihin binäärilukujen komplementtikäännöksiin liittyy.

Metabolix [16.03.2021 15:27:06]

#

Jere Sumell kirjoitti:

Voisiko olla mahdollista, – –

Yhteenlaskun ylivuoto on erittäin yksinkertainen: laske oikea tulos useammalla bitillä ja pudota ylimääräiset bitit pois. Alla on nelibittinen esimerkki:

    0111
  + 1010
========
 (1)0001

Vähennyslaskun ylivuoto on myös yhtä yksinkertainen: kuvittele luvun alkuun ylimääräinen ykkönen, josta voi lainata. Mitään ennakoivaa bittien kääntelyä ei tässä pidä tehdä, vaan lasku toimii aivan kuin kymmenjärjestelmässäkin.

  (1)0111
   - 1010
=========
  (0)1101

Sen sijaan kahden komplementilla vähennyslaskun voi kääntää yhteenlaskuksi (tai laskun negatiivisella luvulla voi kääntää laskuksi positiivisella luvulla):

     0111  =   0111
   - 1010  = + 0110
===================
               1101

Jere Sumell [17.03.2021 17:31:01]

#

Tuo yhden lisääminen tuottaa ongelmia, että mihin kohtaan se lisätään.

En tiedä, olenko käsittänyt oikein, mutta tietokoneen prosessori laskee pelkästään positiivisia lukuja, näin ollen nykyisissä tietokoneissa kaikki binääriluvut ovat kahden komplementteja, että nollalla ei ole kuin yksi esitys (+0,0000).

Jos rakentaa loogisilla piireillä puolivähentimen, puolisummaimen tapaan, niin tuo kääntöoperaatio hyödyllinen.

En tiedä, kun olen kurssilla tällä hetkellä, missä oli kotitehtävissä tehtävä, jossa piti pythonilla ohjelmoida metodi, joka toteuttaa puolisummaimen, eli kun syöteparametereina on (x,y) nollia tai ykkösiä pelkästään, niin metodin lopussa palautetaan taulukko, joka sisältää summasarakkeen ja muistinumeron. Sen koodin sain toimimaan täysin pistein yhdellä lähetyskerralla, kun ohjelmoin metodin nano-editorilla.

Voisi vapaa-ajalla laajentaa sellaiseen metodiin, jossa kutsutaan tuota summainmetodia, että se saa syötteenä kaksi kokonaislukutaulukkoa, joka laskee bitti kerrallaan oikean lopputuloksen.

Kurssini on vasta kaksi viikkoa kestänyt,mutta ensimmäisellä viikolla mitä piti ohjelmoida Javalla metodit, ensin piti syöteparametrina kokonaislukutaulukon binääriluku muuntaa 10 -järjestelmään, ja toinen metodi, joka muuntaa kokonaislukutaulukon arvot heksaluku-järjestelmään.

Tuollainen Java tai python luokkakirjaston luonti voisi olla mielekäs vapaa-ajan puuha, vaikka noissa ohjelmointikielissä on keinot, joilla ne pystyy muuntamaan noihin lukujärjestelmiin ja osaa laskea suoraankin niitä, ettei tarvitse ihan bitti kerralla kynä/paperi - menetelmä -edellä lähteä ohjelmoimaan nollasta.

Mitä pidän ohjelmoinnista paljon, niin voisi ajan kuluksi tehdä tuollaisen ja pistää vaikka jakoon Githubissa sitten, kun kurssi päättyy, että ketään ei kopioi kotitehtävien vastauksia koodistani. Itselleni sama, mutta kurssilla kiellettiin kotitehtävien julkaisu tai plagiointi, kysely foorumeilla etukäteen.

Noista lukuconverttereista tuli mieleen, että netti on täynnä niitä jostain syystä, ja kun katsoin Duckduckgo -hakutermillä "binääriluku allekkain lasku", niin päädyin tähän ohjelmointiputkan Antti Laaksosen kirjoittamaan artikkeliin, ja loput hakutuloksista oli noita muunnoslaskimia sisältäviä onko ne sitten enimmäkseen "spammi" -sivuiksi luokiteltavia, jos ottaa huomioon, että sivuilla ole juuri muuta sisältöä noiden laskimien lisäksi, paitsi mainoksia. Yksi sivu esti laskurin käytön, kun sivusto havaitsi, että käytän mainosblockeria.

Metabolix [17.03.2021 19:13:26]

#

Jere Sumell kirjoitti:

Tuo yhden lisääminen tuottaa ongelmia, että mihin kohtaan se lisätään.

Minusta vaikuttaa siltä, että olennainen virhe liittyy nyt siihen, pitääkö mitään muunnosta ylipäänsä tehdä. Yleensä ei pidä.

Kahden komplementti tarvitsee laskea vain silloin, kun halutaan laskea luvusta x luku -x ja jostain syystä ei ole mahdollista suoraan kirjoittaa -x.

Kahden komplementtia laskettaessa bitit käännetään ympäri (~-operaatio) ja lukuun lisätään yksi. 8-bittisiä esimerkkejä käyttäen kahden komplementti luvusta 7 = ~00000111 + 1 = 11111000 + 1 = 11111001 = 249 = -7.

Eli jos jostain syystä tehtävässä olisi annettu erikseen tieto, että luku on 93 mutta miinusmerkkinen, niin voitaisiin laskea kahden komplementti luvusta 93 = ~01011101 + 1 = 10100010 + 1 = 10100011 = 163 = -93.

Kun luku on jo binäärimuodossa, ei tarvitse itse tehdä mitään kahden komplementin muunnosta, vaan binäärilukuja voidaan summata ja vähentää välittämättä siitä, ovatko ne negatiivisia vai positiivisia.

Vaikka olisi annettu nuo yksittäiset bitit vaikka tekstimuodossa tai taulukkona ja pitäisi ikään kuin simuloida binäärilaskentaa, laskut voisi tehdä suoraan ilman mitään muunnosta.

Jere Sumell [25.03.2021 07:28:30]

#

Kiitos Metabolix!

Käytin yhden torstai-illan noiden miinusmerkkisten vähentäjien kanssa ja nyt handlaan ne. Tosin vähän hitaammalla algoritmilla, nimittäin muutin ensin binääriluvun kymmenjärjestelmään, josta sitten kertosin miinusmerkkisen kymmenlukujärjestelmän miinusmerkkisen itseisarvon 2^n, jossa n on bittien lukumäärä, kuinka monella bitillä binääriluku on esitetty, jonka jälkeen sen tuloksen muutin takaisin binääriluvuksi. Sain tulokset oikein, mutta tosiaan ei nopein mahdollinen keino ratkaista vähentäjän binääriluku, mutta toimiva.

Metabolix [25.03.2021 09:12:24]

#

Jere Sumell kirjoitti:

nyt handlaan ne – – muutin ensin binääriluvun kymmenjärjestelmään,

Sanoisin kyllä, että jos joudut muuttamaan luvun kymmenjärjestelmään asian ratkaisemiseksi, binääriluvut eivät ole hallinnassa. Näytä, millaiset tiedot sinulla on syötteenä ja mitä niistä pitää laskea, niin voidaan selvittää asia.

Jere Sumell kirjoitti:

kertosin miinusmerkkisen kymmenlukujärjestelmän miinusmerkkisen itseisarvon 2^n

En ymmärrä, mitä tuossa lukee.

Grez [25.03.2021 10:04:58]

#

siis binääriluvuilla laskeminen on ihan helppoa:

x -y = x + ~y + 1


Eli

  01010011
- 00110101

=
  01010011
+ 11001010
+ 00000001

= 00011110

Jos niiden laskemiseen tarvitsee 10-kantalukuja, niin voi unohtaa kokonaan binääriluvut.

Jere Sumell [25.03.2021 11:17:51]

#

Metabolix kirjoitti:

Sanoisin kyllä, että jos joudut muuttamaan luvun kymmenjärjestelmään asian ratkaisemiseksi, binääriluvut eivät ole hallinnassa. Näytä, millaiset tiedot sinulla on syötteenä ja mitä niistä pitää laskea, niin voidaan selvittää asia.

Ei ole ohjelmakoodia, mitä olen tuottanut, vaan kynä/paperi -mentelmällä olen laskenut ilman laskintakin.

Jere Sumell kirjoitti:

kertosin miinusmerkkisen kymmenlukujärjestelmän miinusmerkkisen itseisarvon 2^n

Metabolix kirjoitti:

En ymmärrä, mitä tuossa lukee.

2^n, 2 potenssiin n + luvun negatiivinen itseisarvo, jossa n on bittilukumäärä, kuinka monella bitillä binääriluku on esitetty. Tuossa aiemmassa postauksessa oli kertominen, mutta se oli virheellinen, laskuoperaatio on summaus eikä kertominen.

esim.
0000
-1111

- 1111 = 15 (-15+2^4[koska 1111 on nelibittinen binääriluku-esitys]) eli 1 on binäärinä 0001

0000
+0001
------
=0001

0000-1111 = 0001

Metabolix [25.03.2021 11:39:29]

#

Jere Sumell kirjoitti:

- 1111 = 15 (-15+2^4[koska 1111 on nelibittinen binääriluku-esitys]) eli 1 on binäärinä 0001

Kymmenjärjestelmää et edelleenkään tähän tarvitse, vaan tässä voit nyt käyttää sitä kahden komplementtia: -1111 = ~1111 + 1 = 0000 + 1 = +1.

Näissä kaavoissa ~-merkki tarkoittaa bittien kääntöä eli yhden komplementtia. Ohjelmointikontekstissa bittiasioissa kannattanee varata ^-merkki xor-operaatiolle, ja sen sijaan potenssiin voi käyttää **-merkintää. Toinen vaihtoehto on kirjoittaa operaatiot auki. Erityisesti kun aiemmin mainitsit Javan (ja et muita kieliä), olisi luontevaa, että ^-symbolin merkitys olisi sama kuin Javassa eli xor.

Kerrataan vielä uudestaan nelibittisillä esimerkeillä:

Yhden komplementti:
     ~x     =  1111     - x

Kahden komplementti:
-x = ~x + 1 =  1111     - x + 1
            =  1111 + 1 - x
            = 10000     - x
            = 2 ** n    - x

Huomataan, että kahden komplementti on aivan sama asia kuin tuo 2**n - x ja myöskin sama kuin ensimmäisessä vastauksessa mainitsemani ”kuvittele luvun alkuun ylimääräinen ykkönen, josta voi lainata”.

Ja kuten Grez edellä kirjoitti, kahden komplementilla voi muuttaa vähennyslaskun yhteenlaskuksi:

Grez kirjoitti:

x -y = x + ~y + 1

Jere Sumell [25.03.2021 12:29:09]

#

No tämä asia nyt vaikuttaa nyt melko pureskellulta.

Käytän tavallisesti tuota ^merkkiä potenssin merkityksessä, vaikka se tosiaan voi olla harhaanjohtava, kun täällä Ohjelmointiputkassa kuten muillakaan foorumeilla ei ole tarjolla mitään Matlab -ohjelmiston kaltaista syntaksi-syotto -mahdollisuutta, ja voin jatkossa ottaa tuon sinun ehdottamasi ** merkinnän käyttoon potenssia ilmaistaessa, jos tuon sitten ^varaisi xor -operaatiolle sitä esittämään. Voi olla, että tuo on yleinen standardi esittää ne pelkän puhtaan tekstin esityksessä.

carabia [25.03.2021 13:26:24]

#

yläkolmion(!) käyttö johtunee varmaan siitä, että on melko standardoitunut xor-operaattoriksi ohjelmointikielissä yleisesti. tekstimuodossa, "XOR" varmaankin olisi se simppelein ilmaisu.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta