/ Forside / Karriere / Uddannelse / Højere uddannelser / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Højere uddannelser
#NavnPoint
Nordsted1 1588
erling_l 1224
ans 1150
dova 895
gert_h 800
molokyle 661
berpox 610
creamygirl 610
3773 570
10  jomfruane 570
Heltals division med 2 og shift right logi~
Fra : Paminu


Dato : 25-01-06 23:18

For de computer interesseret. Hvis man laver shift right logical (srl) med 1
på et tal angivet i binær notation svarer det så ikke til at lave heltals
division med 2?

eks:

1101 bin = 13 dec

efter srl:

0100 bin = 4 dec

der svarer til 13 DIV 2 = 4 hvor rest = 1.


findes der ikke en kortere betegnelse for heltalsdivision?



 
 
Uffe Kousgaard (25-01-2006)
Kommentar
Fra : Uffe Kousgaard


Dato : 25-01-06 23:28

"Paminu" <sdf@asd.com> wrote in message
news:dr8ti0$61o$1@news.net.uni-c.dk...
> For de computer interesseret. Hvis man laver shift right logical (srl) med
1
> på et tal angivet i binær notation svarer det så ikke til at lave heltals
> division med 2?

Jo. Mange compilere kan selv finde ud af at lave denne lille finte. Jeg
kender mest "srl" som "shr" (shift right).

> 1101 bin = 13 dec
>
> efter srl:
>
> 0100 bin = 4 dec
>
> der svarer til 13 DIV 2 = 4 hvor rest = 1.

13 DIV 2 = 6 = 0110

> findes der ikke en kortere betegnelse for heltalsdivision?

Tror jeg ikke, DIV eller heltalsdivision anvendes normalt.

hilsen
Uffe



Ulrik Smed (26-01-2006)
Kommentar
Fra : Ulrik Smed


Dato : 26-01-06 01:41

Uffe Kousgaard wrote:
> "Paminu" <sdf@asd.com> wrote in message
> news:dr8ti0$61o$1@news.net.uni-c.dk...
>> der svarer til 13 DIV 2 = 4 hvor rest = 1.
>
> 13 DIV 2 = 6 = 0110

Og resten på 1 ligger i carryflaget.

--
Ulrik Smed
Aarhus, Denmark



Martin Larsen (25-01-2006)
Kommentar
Fra : Martin Larsen


Dato : 25-01-06 23:59

Paminu fortalte:
>
>
> findes der ikke en kortere betegnelse for heltalsdivision?

Joh, nogen bruger "/" til rationel division og har så en funktion der
omregner til float, hvis man ønsker det.
Nogen bruger "\" til heltalsdivision.

Mvh
Martin
--
Entia non sunt multiplicanda praeter necessitatem


Per Abrahamsen (26-01-2006)
Kommentar
Fra : Per Abrahamsen


Dato : 26-01-06 09:01

"Paminu" <sdf@asd.com> writes:

> For de computer interesseret. Hvis man laver shift right logical (srl) med 1
> på et tal angivet i binær notation svarer det så ikke til at lave heltals
> division med 2?

Jeps, det er et gammelt trick. Specielt da en del ældre cpu'er slet
ikke har haft heltalsdivision.

> findes der ikke en kortere betegnelse for heltalsdivision?

I C hedder det "/". Hvilket leder til mange fejl, i C gælder det at

(1 / 3) * 3 == 0

hvilket kommer som en overraskelse for de fleste.

Jeg foretrækker klart "div".

Uffe Kousgaard (26-01-2006)
Kommentar
Fra : Uffe Kousgaard


Dato : 26-01-06 09:05

"Per Abrahamsen" <abraham@dina.kvl.dk> wrote in message
news:rjirs7zadr.fsf@sheridan.dina.kvl.dk...
>
> I C hedder det "/". Hvilket leder til mange fejl, i C gælder det at
>
> (1 / 3) * 3 == 0
>
> hvilket kommer som en overraskelse for de fleste.

Hvad hedder almindelig division så i C ?



Bertel Lund Hansen (26-01-2006)
Kommentar
Fra : Bertel Lund Hansen


Dato : 26-01-06 09:50

Uffe Kousgaard skrev:

>> (1 / 3) * 3 == 0

>> hvilket kommer som en overraskelse for de fleste.

> Hvad hedder almindelig division så i C ?

Det hedder også /. Det er jo det der er forvirrende. Hvis man
skal bruge decimaltal, skal man tvinge det:

1.0/3=0.33333...
(double) 1/3=0.33333 ....

Reglen er at man enten skal have et flydende kommatal som et af
tallene eller også skal man caste til den type. I modsat fald får
man heltalsdivision.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Torben Ægidius Mogen~ (26-01-2006)
Kommentar
Fra : Torben Ægidius Mogen~


Dato : 26-01-06 10:25

Bertel Lund Hansen <nospamfilius@lundhansen.dk> writes:

> Uffe Kousgaard skrev:
>
> >> (1 / 3) * 3 == 0
>
> >> hvilket kommer som en overraskelse for de fleste.
>
> > Hvad hedder almindelig division så i C ?
>
> Det hedder også /. Det er jo det der er forvirrende. Hvis man
> skal bruge decimaltal, skal man tvinge det:
>
> 1.0/3=0.33333...
> (double) 1/3=0.33333 ....
>
> Reglen er at man enten skal have et flydende kommatal som et af
> tallene eller også skal man caste til den type. I modsat fald får
> man heltalsdivision.

Jeg er enig med Bertel om, at det er forvirrende i C. Men det skyldes
ikke kun, at den samme operator bruges på flere forskellige typer
(overloading), men at overloading kombineres med automatisk
konvertering mellem heltal og flydende kommatal, hvilket betyder at
man som programmør skal vide præcis hvor de automatiske konverteringer
bliver sat ind for at vide om en division er mellem heltal eller
flydende kommatal. F.eks. er

(double) 1/3=0.33333

mens

(double) (1/3) = 0.0000

Ligeledes er

(double) ((x = 1)/3)

lig med 0.0000, hvis x er en heltalsvariabel mens det er 0.33333, hvis
x er en kommatalsvariabel.

Torben

Torben Ægidius Mogen~ (26-01-2006)
Kommentar
Fra : Torben Ægidius Mogen~


Dato : 26-01-06 09:29

"Paminu" <sdf@asd.com> writes:

> For de computer interesseret. Hvis man laver shift right logical (srl) med 1
> på et tal angivet i binær notation svarer det så ikke til at lave heltals
> division med 2?
>
> eks:
>
> 1101 bin = 13 dec
>
> efter srl:
>
> 0100 bin = 4 dec
>
> der svarer til 13 DIV 2 = 4 hvor rest = 1.

Når du bruger srl (logisk højreskift), er et skift med n bit det samme
som division med 2^n, men kun for ikke-negative tal. For tal, der kan
være negative, skal du bruge aritmetisk højreskift, som adskiller sig
fra det logiske højreskift ved at kopiere fortegnsbittet (det mest
betydende bit) ind i de "nye" bit. Det giver korrekt division for tal
i tokomplementrepræsentation.

For venstreskift er der ikke forskel på logisk og arimetisk skift,
idet der altid skiftes nuller ind.

Endvidere findes der i nogle processorer en højre/ventreskift med
mente, som skifter menten (carry) ind som det nye bit og lægger det
udskiftede tal ind i menten. Det muliggør skift af tal, der fylder
mere end et maskinord. Dette kan dog kun gøres med et-bits skift.

> findes der ikke en kortere betegnelse for heltalsdivision?

Der er ikke nogen udbredt standard for en kort notation. Nogle sprog
bruger "/" til både heltalsdivision og division med kommatal, og
vælger mellem de to operationer ud fra argumenternes typer. Andre
bruger "/" til kommatal og enten "\" eller "//" til heltal. Men hvis
man ikke har en kontekst (f.eks. et programmeringssprog), der
tydeliggør meningen, bør man altid forklare, hvad man mener med
f.eks. "\" eller "//".

Torben

Martin Larsen (26-01-2006)
Kommentar
Fra : Martin Larsen


Dato : 26-01-06 12:46

"Torben Ægidius Mogensen" fortalte:

> Andre
> bruger "/" til kommatal og enten "\" eller "//" til heltal.

Jeg kender kun "//" som rationel division.
Iøvrigt - mon ikke rationel division efterhånden bliver standard inventar
i ethvert sprog? måske ligefrem erstatter alt andet.

Mvh
Martin
--
Hvem fortalte dig, at du var nøgen?


Lasse Reichstein Nie~ (26-01-2006)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 26-01-06 18:46

"Martin Larsen" <mlarsen@post7.tele.dk> writes:

> Iøvrigt - mon ikke rationel division efterhånden bliver standard
> inventar i ethvert sprog? måske ligefrem erstatter alt andet.

Næppe så længe der er hardwareunderstøttelse for IEEE floatingpoint-
aritmetik, og ikke for regning med rationelle tal.

/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Martin Larsen (26-01-2006)
Kommentar
Fra : Martin Larsen


Dato : 26-01-06 20:19

Lasse Reichstein Nielsen fortalte:

> "Martin Larsen" <mlarsen@post7.tele.dk> writes:
>
>> Iøvrigt - mon ikke rationel division efterhånden bliver standard
>> inventar i ethvert sprog? måske ligefrem erstatter alt andet.
>
> Næppe så længe der er hardwareunderstøttelse for IEEE floatingpoint-
> aritmetik, og ikke for regning med rationelle tal.
>
Hmm, bemærk at der er 2 trin i min formodning - det sidste bliver
naturligvis ikke aktuelt før ældre systemer virker for antikverede.
Iøvrigt - som rationelle implementeres i dag har man vist ikke hensyn til
eksponenten. Måske skulle man have rationelle med rationel eksponent og
standard for arrays (algebraiske). Så ville folk være fri for at skrive
programmer der løser 2.gradsligninger

Mvh
Martin
--
Thou shalt break them with a rod of iron


Kurt Kjær Jensen (26-01-2006)
Kommentar
Fra : Kurt Kjær Jensen


Dato : 26-01-06 19:38

Torben Ægidius Mogensen wrote:

> "Paminu" <sdf@asd.com> writes:
>
>
>>For de computer interesseret. Hvis man laver shift right logical (srl) med 1
>>på et tal angivet i binær notation svarer det så ikke til at lave heltals
>>division med 2?
>>
>>eks:
>>
>>1101 bin = 13 dec
>>
>>efter srl:
>>
>>0100 bin = 4 dec
>>
>>der svarer til 13 DIV 2 = 4 hvor rest = 1.
>
>
> Når du bruger srl (logisk højreskift), er et skift med n bit det samme
> som division med 2^n, men kun for ikke-negative tal. For tal, der kan
> være negative, skal du bruge aritmetisk højreskift, som adskiller sig
> fra det logiske højreskift ved at kopiere fortegnsbittet (det mest
> betydende bit) ind i de "nye" bit. Det giver korrekt division for tal
> i tokomplementrepræsentation.

Bortset fra særtilfældet -1, som strander på -1 uanset antal højreskift
med sign-extension (-1 i 8 bit to-komplement er 11111111).

> For venstreskift er der ikke forskel på logisk og arimetisk skift,
> idet der altid skiftes nuller ind.

Ja, hvis det er i to-komplement repræsentation. Venstreskift giver helt
forkert resultat i ét-komplement repræsentation.

--
Venlig hilsen
Kurt


Torben Ægidius Mogen~ (27-01-2006)
Kommentar
Fra : Torben Ægidius Mogen~


Dato : 27-01-06 09:22

Kurt Kjær Jensen <slettes_kkjen_slettes@aub.dk> writes:

> Torben Ægidius Mogensen wrote:
>
> > "Paminu" <sdf@asd.com> writes:
> >
> >> For de computer interesseret. Hvis man laver shift right logical
> >> (srl) med 1 på et tal angivet i binær notation svarer det så ikke
> >> til at lave heltals division med 2?
> >>
> >>eks:
> >>
> >>1101 bin = 13 dec
> >>
> >>efter srl:
> >>
> >>0100 bin = 4 dec
> >>
> >>der svarer til 13 DIV 2 = 4 hvor rest = 1.
> > Når du bruger srl (logisk højreskift), er et skift med n bit det
> > samme
> > som division med 2^n, men kun for ikke-negative tal. For tal, der kan
> > være negative, skal du bruge aritmetisk højreskift, som adskiller sig
> > fra det logiske højreskift ved at kopiere fortegnsbittet (det mest
> > betydende bit) ind i de "nye" bit. Det giver korrekt division for tal
> > i tokomplementrepræsentation.
>
> Bortset fra særtilfældet -1, som strander på -1 uanset antal
> højreskift med sign-extension (-1 i 8 bit to-komplement er 11111111).

Det er da rigtigt nok. Heltalsdivision af ulige tal skal runde
resultatet ned, og floor(-1/2) = -1.

Mange programmeringssprog tillader dog heltalsdivision runde mod nul i
stedet for at runde ned, hvilket gør at man ikke kan bruge højreskift
til division med (potenser af) to. Og det er ikke kun -1, der er et
særtilfælde, alle ulige negative tal giver forskellige resultater med
afrunding nedad eller afrunding mod 0.

Selv om man runder mod nul, kan man alligevel udnytte højreskift til
division med to, hvis man blot AND'er med -2 først.

En kuriositet er, at programmeringssproget C ikke specificerer om
heltalsdivision skal runde ned eller runde mod 0. Så hvis du laver et
program, dr forudsætter f.eks. runding mod 0, kan du ikke være sikker
på, at det fungerer med alle C compilere. Dog skal reglen
(x/y)*y+(x%y)=x være opfyldt også for negative x eller y.

Selv foretrekker jeg klart runding nedad, idet det betyder at x%y
altid ligger mellem 0 og y-1, at (x+y)%y = x%y, og andre rare
algebraiske egenskaber. Og så er det også mere effektivt for division
med toerpotenser.

> > For venstreskift er der ikke forskel på logisk og arimetisk skift,
> > idet der altid skiftes nuller ind.
>
> Ja, hvis det er i to-komplement repræsentation. Venstreskift giver
> helt forkert resultat i ét-komplement repræsentation.

Ja, men jeg forudsatte jo netop også tokomplement.

Torben

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste