Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Bittioperaatioita (shift)

Sivun loppuun

Baglair [29.12.2005 22:16:49]

#

#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?

Metabolix [29.12.2005 22:22:05]

#

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.

Deewiant [29.12.2005 22:22:20]

#

Siksi, että se nyt vain yksinkertaisesti toimii niin.

thefox [30.12.2005 00:35:24]

#

Metabolix kirjoitti:

Koska se on bitshift (asm shl/shr) eikä rotate (asm rtl/rtr).

x86:ssa rotate-käskyjen nimet ovat rol ja ror.

Metabolix [30.12.2005 00:43:03]

#

Anteeksi kovasti. Viimeksi käyttänyt noita pari vuotta sitten.

Baglair [30.12.2005 00:54:46]

#

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.

Metabolix [30.12.2005 01:39:17]

#

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ä.

thefox [01.01.2006 16:09:36]

#

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;
}

Sivun alkuun

Vastaus

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

Tietoa sivustosta