AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Bitweise Prüfung eines Int
Thema durchsuchen
Ansicht
Themen-Optionen

Bitweise Prüfung eines Int

Ein Thema von Jelly · begonnen am 20. Mär 2008 · letzter Beitrag vom 20. Mär 2008
Antwort Antwort
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#1

Bitweise Prüfung eines Int

  Alt 20. Mär 2008, 09:01
Datenbank: MSSQL • Version: 2000 • Zugriff über: irrelevant
Ich habe ein kleines Problem mit einer bitweisen Prüfung unter T-SQL.

Ich habe eine Nachschlagtabelle, bei der die Spalte x (vom Typ BigInt), die nur Werte annehmen darf, die in der bitweisen Darstellung nur ein Bit einnehmen, also Werte, die darstellbar sind als 2^n. Auf dieser Seite habe ich dazu auch den entsprechenden mathematischen Ausdruck gefunden:

Code:
(x & (x-1)) = 0
Das wollte ich als Constraint in meiner Tabellendefinition so angeben, was T-SQL auch erstmal so nimmt. Wenn ich mir nach dem Speichern der Tabelle jedoch den Constraint nochmal anschaue, wird daraus
Code:
(x & x - 1 = 0)
was aber falsch ist. Es werden mir die Klammern gelöscht.

Wie kann ich diese Prüfung denn nun vielleicht anders durchführen ?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Bitweise Prüfung eines Int

  Alt 20. Mär 2008, 09:13
Hallo Tom,

im vorliegenden Fall speichert man eher den Exponenten zur Basis 2 als das Ergebnis. Vielleicht kannst du das ja noch ändern.

Freundliche Grüße
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Bitweise Prüfung eines Int

  Alt 20. Mär 2008, 09:23
Hm, das ist vielleicht auch eine Idee. Aber ums mir mal bestätigen zu lassen, as für meinen Fall das einfachste ist.

Diese Tabelle dient sozusagen als Nachschlagtabelle. In der referierten Tabelle soll eine Art Multichoice möglich sein. Ich wollte vermeiden, direkt für jede Option ein eigenes Feld in der Tabelle anzulegen, sondern will mit Bitoperationen mir meine Multichoice Wahl darstellen. Dadurch bleibe ich, denke ich, flexibler wenn Optionen hinzukommen. Da es definitiv nie mehr als 64 werden, würde eine solche Darstellung also passen.

Ich habe also die Möglichkeit, nur den Exponenten zu speichern (1,2,3,...,64) oder direkt die entsprechende numerische Darstellung (1,2,4,8,16,...2^64).

In der Referenztabelle ist klar, was ich zu speichern habe (5 entspräche Bit 0 und Bit 2 gesetzt).

In welcher Darstellung bleib ich denn nachher am flexibelsten, will ich die 5 wieder aufsplitten und z.B. in einer CheckedListBox darstellen?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Bitweise Prüfung eines Int

  Alt 20. Mär 2008, 09:43
Angenommen ich habe folgende Tabellen:

Code:
ANSWERS (ID, TXT, QST_ID, SEQ)
QUESTIONS (ID, TXT, ANS_CODE)
In SEQ trage ich für jede QST_ID fortlaufende Nummern (0..63) ein - die Exponenten. Eine lückenlose Vergabe ist vernünftig, aber nicht notwendig.

Willst du später prüfen, ob eine gültige Antwort markiert wurde, dann helfen dir POWER(2, SEQ) und ein bitweises AND mit ANS_CODE.

Wozu ein CHECK?

Du hast nicht wirklich 64 Choices per Question?
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Bitweise Prüfung eines Int

  Alt 20. Mär 2008, 10:12
Zitat von marabu:
Du hast nicht wirklich 64 Choices per Question?
Nein. Es wird viele Fragen geben, und ich werde für jede einzelne Frage so eine Nachschlagtabelle zimmern müssen. Mehr als 6-8 Records wird es wohl kaum geben.

Zitat von marabu:
Wozu ein CHECK?
Ich muss ja, wenn ich die ausgewählten Antworten laden will, irgendwie leicht rausfinden, ob eine Antwort gecheckt ist oder nicht. Am liebsten mit einem SQL Befehl...

Ich habe mittlerweilen deine Idee umgesetzt, also dass ich nur den Exponenten wähle, und das klappt hervorragend... Und mit folgendem Select kriege ich dann auch gleich in einem Ruck alle Antworten zurück, die für eine Frage möglich sind, unter Angabe ob die Antwort gecheckt ist oder nicht. Damit wird eine Darstellung z.B. in einer CheckedListBox zum Kinderspiel (ich habe mich dabei an deine Tabellenstruktur gehalten wie du sie im Beispiel angegeben hast):

SQL-Code:
select q.Id, a.Txt
  ip.InfosPersonellesId, me.Description
from
  Questions q
right outer join
  Answers a on (Power(2, a.SEQ) & q.ANS_CODE) = Power(2, a.SEQ) and q.Id = @Id
order by
  a.Txt
Dies liefert mir für die Frage @Id alle Antwortmöglichkeiten. Ist die Antwort gecheckt, so ist die q.Id Spalte nicht null. Ist sie nicht gecheckt, dann NULL.

Vielleicht hilft der Join ja mal einem hier bei einem analogem Problem.

Danke Achim..

EDIT: Fehler im Select behoben...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz