Avatar billede md_craig Nybegynder
31. januar 2006 - 13:34 Der er 1 kommentar og
1 løsning

Læse / Skrive / Konvertere Syncsafe Integers

<OT-Udbrud> HADER DIG EKSPERTEN </OT-Udbrud>

Ja overstående kan virke skræmmende og useriøs... men havde lige skrevet spørgsmålet ned meget specifikt... og det mente eksperten så ikke var helt godt nok og nu er det så VÆK!...

Så nu kommer der altså en kort version istedet...
--------------------------------------------------------------------

Emnet er nok beskrivende nok i sig selv... Hvis man altså ved hvad en Syncsafe integer er...

Ellers kan det lige kort forklares som en int, i dette tilfælde 32 bit, som holder den højreste bit i alle byte 0, hvilket vil sige at der kun er 28 efektive bit.

fx tallet 1.023 som har den binære representation af:

0000 0000 . 0000 0000 . 0000 0011 . 1111 1111

lagres som 1.919:

0000 0000 . 0000 0000 . 0000 0111 . 0111 1111
------------------------------------------------------------------
Læsning:

Havde tænkt mig at bruge shift operatorene, dette gør jeg ved at læse de 4 bytes der udgør den, og så konverete dem enkeltvis til integers og shifte dem så meget som det nu hver i sær skal og til sidst lægge dem sammen...

Tager vi igen 1.023 (1.919)

0000 0000 . 0000 0000 . 0000 0111 . 0111 1111

representation af integers efter indlæsning af bytes:
a= int for byte 1: 0000 0000 . 0000 0000 . 0000 0000 . 0000 0000 (0)
b= int for byte 2: 0000 0000 . 0000 0000 . 0000 0000 . 0000 0000 (0)
c= int for byte 3: 0000 0000 . 0000 0000 . 0000 0000 . 0000 0111 (7)
d= int for byte 4: 0000 0000 . 0000 0000 . 0000 0000 . 0111 1111 (127)

a << 21; b << 14; c << 7; d << 0;


representation af integers efter shift operation:
a= int for byte 1: 0000 0000 . 0000 0000 . 0000 0000 . 0000 0000 (0)
b= int for byte 2: 0000 0000 . 0000 0000 . 0000 0000 . 0000 0000 (0)
c= int for byte 3: 0000 0000 . 0000 0000 . 0000 0011 . 1000 0000 (896)
d= int for byte 4: 0000 0000 . 0000 0000 . 0000 0000 . 0111 1111 (127)

r= summen af alle: 0000 0000 . 0000 0000 . 0000 0011 . 1111 1111 (1.023)

Hvilket vel alt i alt er godt nok?... men er der bedre / mere effektive måder, Pt kigger jeg ikke på hvordan bytesne er lagret (big eller smal indian)...
skal naturligvis lige med på en eller anden måde.

------------------------------------------------------------------
Skrivning:

Skrivningen af den havde jeg tænkt mig at prøve at gå baglæns i forhold til det overstående ved brug af %  og  /
Altså (X % 127) må give de 7 sidste bit,  (X / 127) må fjerne de sidste 7 bit... i og med det er heltals division...

Er den god nok. og igen, er der andre / bedre måder at håntere det på?...
Avatar billede md_craig Nybegynder
31. januar 2006 - 17:52 #1
Okay... fik vist konverteringen på plads på en latterlig nem måde i forhold...

static int ConvertTo(int value)
{
  int x0 = (value >> 21) % 128;
  int x1 = (value >> 14) % 128;
  int x2 = (value >> 7) % 128;
  int x3 = (value >> 0) % 128;

  return (x0 << 24) + (x1 << 16) + (x2 << 8) + x3;
}

static int ConvertFrom(int value)
{
  int x0 = (value >> 24) % 128;
  int x1 = (value >> 16) % 128;
  int x2 = (value >> 8) % 128;
  int x3 = (value >> 0) % 128;

  return (x0 << 21) + (x1 << 14) + (x2 << 7) + x3;
}

Kunne jo sikkert snildt pakkes mere ned...
Og var vist alt andet end lige mere simpelt end modulusser og divisioner i øst og vest :P
Avatar billede md_craig Nybegynder
26. maj 2006 - 21:14 #2
skal lige huske at lukke... øhhh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester