Avatar billede g4nd4lf Nybegynder
02. november 2004 - 10:19 Der er 16 kommentarer og
2 løsninger

Konvertering af en int32 til et antal booleans

Jeg er ved at lave et overordnet objekt der skal styre hvor langt en sag er blevet behandlet. For at dette skal komme til at fungere optimalt skal der være en del booleans på dette objekt. Når jeg skal lagre disse mange booleans i min mssql database tænkte jeg at det må være muligt at gemme denne som en integer og så konvertere den om til et binært tal, da den jo så kan indeholde mange rettigheder samtidig.
Nogen der kender til en smart måde at lave denne konvertering på?
Avatar billede arne_v Ekspert
02. november 2004 - 10:22 #1
Måske noget a la:

int iv = ...;
int tmp = iv;
bool[] bv = new bool[31];
for(int i = 0; i < 31; i++)
{
  bv[i] = (tmp % 2) > 0;
  tmp /= 2;
}
Avatar billede bennytordrup Nybegynder
02. november 2004 - 10:35 #2
Hvorfor vil du det? SQL Server pakker i forvejen bit-felter.

Fra Books Online vedr. datatypen bit:


Microsoft® SQL Server™ optimizes the storage used for bit columns. If there are 8 or fewer bit columns in a table, the columns are stored as 1 byte. If there are from 9 through 16 bit columns, they are stored as 2 bytes, and so on.
Avatar billede g4nd4lf Nybegynder
02. november 2004 - 10:38 #3
Grunden til at jeg gerne vil gemme dem der, er at hvis jeg finder ud af at jeg mangler en rettighed mere så skal jeg ikke til at ændre på databasen, men derimod bare lave nogle minimale ændringer i objektet. Ved at gemme det som kolonner i databasen skal jeg til at lave redundante ændringer.
Avatar billede g4nd4lf Nybegynder
02. november 2004 - 10:40 #4
arne_v det virker som en rigtig fornuftig måde at gøre det på, men hvordan vil du gå den anden vej, fra bool[] til int?
Avatar billede bennytordrup Nybegynder
02. november 2004 - 10:40 #5
Det er korrekt, men hvis mangler rettighed nummer 33, skal du alligevel ændre databasen.

IMHO får du mere læsevenlig kode og mere vedligeholdelsesvenlig kode ved at lade SQL Server styre pakningen.
Avatar billede bennytordrup Nybegynder
02. november 2004 - 10:42 #6
Hvor vil de redudante ændringer opstå? Hvis du følger almindelige normaliseringsformer, vil redundans ikke opstå - du vil kun have bit-felterne et sted.
Avatar billede g4nd4lf Nybegynder
02. november 2004 - 10:43 #7
Jeg vil kun have felterne et sted ja, men vil blive nødt til at lave to ændringer istedet for 1, og det vil (heldigvis) aldrig blive til mere end maks 10 rettigheder der skal styres :)
Avatar billede arne_v Ekspert
02. november 2004 - 10:44 #8
bool[] bv = ...;
int v = 0;
for(int i = 0; i < 31; i++)
{
  v = 2*v + (bv[i] ? 1 : 0);
}
Avatar billede arne_v Ekspert
02. november 2004 - 10:44 #9
Nej det for vist sat bittene omvendt.

bool[] bv = ...;
int v = 0;
for(int i = 30; i >= 0; i--)
{
  v = 2*v + (bv[i] ? 1 : 0);
}
Avatar billede bennytordrup Nybegynder
02. november 2004 - 10:45 #10
arne, du mangler bit 31
Avatar billede bennytordrup Nybegynder
02. november 2004 - 10:46 #11
For min skyld kan du gøre det, som du vil.

Jeg vil bare tilføje, at din løsning er den måde, vi i et VB6 program har løst brugerrettigheder, og det er noget p*s at holde styr på.

Skal det ændres i dag, vil jeg i 12 ud af 10 tilfælde vælge løsningen med bit-felter.
Avatar billede arne_v Ekspert
02. november 2004 - 10:48 #12
benny>

Nej. Jeg har meget bevist valgt ikke at tage den højeste bit med, fordi så bliver
signed int negative etc.etc..
Avatar billede arne_v Ekspert
02. november 2004 - 10:48 #13
Og et svar fra mig
Avatar billede bennytordrup Nybegynder
02. november 2004 - 10:49 #14
Så brug en unsigned int (uint eller System.UInt32)
Avatar billede g4nd4lf Nybegynder
02. november 2004 - 10:50 #15
takker for hjælpen, og bennytordrup jeg vil lige overveje din løsning en gang til, men tror bare jeg får et frygteligt bøvl med at overbevise chefen om at databasen skal kunne ændres undervejs, han er meget øm om sine database designs...
Avatar billede bennytordrup Nybegynder
02. november 2004 - 10:51 #16
Fortæl mig et system, der ikke ændrer på databasedesign efter lancering.

Vi laver *masser* af ændringer i databasen - det er alene et spørgsmål om at fyre nogel DDL statements af.
Avatar billede arne_v Ekspert
02. november 2004 - 10:58 #17
Nej tak.

31 bit signed integer er et godt valg som man kan regne med understøttes af
alle database og programmerings sprog.

32 bit unsigned integer er ikke nær så portabel. Og man kan få nogle sære fejl
hvis den uforvarende bliver til en signed int.
Avatar billede bennytordrup Nybegynder
02. november 2004 - 11:01 #18
arne> Godtaget. Men jeg vil til enhver tid vælge bit-løsningen, hvis det er et spørgsmål om at gemme ja/nej-værdier.
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