August 2, 2001
om det är c så utförs högerskift (aritmetisk eller logisk) på den vänstra operanden med det antal bitar som den högra operanden anger.
dvs
x = 8 >> 1
skulle resultera i att x blev 4.
Högerskift kan ses som division med en 2^y och vänsterskift kan ses som multiplikation med 2^y där y anger antal bitpositioner som skiftas.
Jag är inte säker på vad standarden säger om det vid högerskift används aritmetisk eller logisk skift skillnaden:
aritmetisk fyller på med teckenbiten på most signifcant bit
logisk fyller på med 0 på most signifcant bit
Anledningen till att använda skiftoperationer är att de är mycket snabba.
August 14, 2001
August 2, 2001
On 2001-10-11 20:17, Tjoppen wrote:
Jo, jag vet vad binärt är...Men jag tycker bara att 3 >> 2 borde vara typ 3^2...Men det är det inte...
Ngn dom vet hur man gör 3^2 utan pow(3,2)
borde du inte köra 3 << 2 en vänsterskift istället för högerskift, har inte sysslat så mycket med skiftoperationer i högnivå språk utan mest assemblynivå.
EDIT
Tänkte fel detta blir ju 3*2^2
[ Detta Inlägg ändrades av: paul_v den 2001-10-11 21:21 ]
August 2, 2001
On 2001-10-11 21:37, Tjoppen wrote:
Nu tror jag att jag fattar:x >> y
=
x * 2 ^ y
lr?Men vad blir då
x << y
?
Det ät ju inte så svårt att testa själv.
#include
int main(void) {
printf("%d %d %d %d %dn", 1, 1<<1, 1<<2, 1<<3, 1<<4);
printf("%d %d %d %d %dn", 8, 8>>1, 8>>2, 8>>3, 8>>4);
return 0;
}
Ger följande när det körs.
datan~>./test
1 2 4 8 16
8 4 2 1 10
datan~>
Således så är z = x << y ekvialent med z = x*2^y
och z = x >> y ekvialent med z = x/2^y
OBS! detta gäller endast om kompilatorn vid högerskift är implementerat som aritmetisk skift och inte logisk skift, då man skulle få ett tal med ett helt annat tecken och värde mot väntat.
Jag tror dock attt i princip alla kompilatorer använder aritmetisk skift.
Gör en sökning på två komplements representation för ytterligare info för hur datorn representerar heltal med tecken(+-).
2 Guest(s)