#include <stdio.h> int main(void) { //65 hex = 01100101 binaari = kirjain 'e' int x = '\x65'; do { printf("%c ", x); x = x << 1; }while(x != '\x65'); }
Miksi tuon tekee niin, että tuo kaikista vasemman puoleinen bitti ei pomppaakkaan tuonne oikealle vaan häippäsee ja oikealle puolelle tulee tilalle aina 0?
Koska se on bitshift (asm shl/shr) eikä rotate (asm rtl/rtr). Se on paljon hyödyllisempi operaatio, koska sillä saa kerrottua ja jaettua kahdella.
Tuo toinen onnistuu näin:
x = (x << a) | (x >> (32 - a));
kun x on 32-bittinen etumerkitön muuttuja.
Siksi, että se nyt vain yksinkertaisesti toimii niin.
Metabolix kirjoitti:
Koska se on bitshift (asm shl/shr) eikä rotate (asm rtl/rtr).
x86:ssa rotate-käskyjen nimet ovat rol ja ror.
Anteeksi kovasti. Viimeksi käyttänyt noita pari vuotta sitten.
Metabolix kirjoitti:
Tuo toinen onnistuu näin:
x = (x << a) | (x >> (32 - a)); kun x on 32-bittinen etumerkitön muuttuja.
Mitähän mahdoit tuolla tarkoittaa? Ja vielä sellainen kysymys että kai se nyt on mahdollista toteuttaa tuo rotate C:llä ilman kummempia mongerruksia kerran se on prosessorin komento ellen nyt väärin asiaa ilmaissut.
Juuri sitä rotatea tarkoitin. Ja ei, siihen ei tietääkseni ole "helppoa" tapaa. Prosessori sisältää vaikka kuinka paljon komentoja, joita ei ihan suoraan saa C:llä tehtyä.
Ei ole helppoa tapaa. Paitsi joidenkin kääntäjien laajennukset (esim. <<< ja >>> rotatelle). Yksi vaihtoehto on tietysti tehdä esim. inline-funktio, jossa on inline assemblylla hoidettu nuo. Tämä tapa ei kuitenkaan tietysti ole porttautuva edes saman saman alustan kääntäjien kesken.
MSVC:llä menisi esimerkiksi jotensakin näin (C):
__inline unsigned rol(unsigned a, unsigned char b) { __asm mov cl, b __asm rol a, cl return a; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.