Bits bei BigInteger abprüfen

Status
Nicht offen für weitere Antworten.
P

PHANTOMIAS

Aktives Mitglied
Hallo an alle!

Ich habe ein 2x2 Array von BigInteger-Variablen, die in Basis 2 geschrieben wurden, mit 4 Bits, also bspw. "1100".
Diese 4 BigInteger-Werte müssen "transformiert" werden, gemäß dieser Logik:
a = b_1
b = b_0 + b_3
c = b_3 + b_2
d = b_2

Beispiel:
Ich habe
klassenvariable_test[1][0] = 1100
-> Somit entspricht
b_0 = 0
b_1 = 0
b_2 = 1
b_3 = 1

->
a = b_1 = 0
b = b_0 + b_3 = 0 + 1 = 1
c = b_3 + b_2 = 1 + 1 = 0
d = b_2 = 0

-> Überschreiben des bisherigen Werts im Array:
klassenvariable_test[1][0] = "0100" (a, b, c, d)

Meine Variante scheint mir da relativ "aufwändig" zu sein (zumal sie auch nicht funktioniert, dazu weiter unten).
Wie kann man denn das geschickter realisieren?
Java:
		BigInteger newOne = new BigInteger("0", 2);
		boolean b0 = false, b1 = false, b2 = false, b3 = false;
		// b0
		if(klassenvariable_test[1][0].and(new BigInteger("0001", 2)) != new BigInteger("0000")) {
			b0 = true;
		}
		if(klassenvariable_test[1][0].and(new BigInteger("0010", 2)) != new BigInteger("0000")) {
			b1 = true;
		}
		if(klassenvariable_test[1][0].and(new BigInteger("0100", 2)) != new BigInteger("0000")) {
			b2 = true;
		}
		if(klassenvariable_test[1][0].and(new BigInteger("1000", 2)) != new BigInteger("0000")) {
			b3 = true;
		}
		if (b1) {
			newOne.setBit(3);
		}
		if (b0 ^ b3) {
			newOne.setBit(2);
		}
		if (b3 ^ b2) {
			newOne.setBit(1);
		}
		if (b2) {
			newOne.setBit(0);
		}

Hier der Teil der fehlschlägt. Es erscheint "Ausgabe", die eigentlich nicht erscheinen sollte. Ich will 1001 mit 0010 UND verknüpfen, das Ergebnis sollte 0000 lauten und also nicht != new BigInteger("0000", 2) sein und somit nicht in die Bedingung hineinspringen. Tut es aber, und mir ist unklar wieso.

Java:
if((new BigInteger("1001", 2)).and(new BigInteger("0010", 2)) != new BigInteger("0000", 2)) {
			System.out.println("Ausgabe");
		}

Hat jemand eine Idee wieso diese Bedingung erfüllt wird? Und wie man das geschickter realisieren könnte?

Danke + Gruß PHANTOMIAS
 
S

SlaterB

Gast
Objekte mit equals vergleichen, nicht mit == oder !=, kennt man doch von String ;)

die fünf benötigten BigInteger solltest du nicht ständig neu erzeugen, sondern in statischen Variablen (Konstanten) ablegen, z.B.
OOOI
OOIO
usw.
dann wird es schon kürzer

für new BigInteger("0000") gibts schon BigInteger.ZERO

------

klassenvariable_test[1][0] muss du auch nicht x-mal schreiben, definiere dir
BigInteger k = klassenvariable_test[1][0];
und arbeite auf k,
sprechende Variablennamen sind meist schöner, aber bei dichten Berechnungen mit begrenzt vielen Variablen kann man auch mal abkürzen,

du könntest auch noch Hilfsmethoden definieren, etwa
Java:
if (isBitSet(k, OOOI)) {
   b0 = true;
}

bzw. ohne if:

b0 = isBitSet(k, OOOI);
aber bei nur 4 Vergleichen kannst du auch darauf verzichten,

------

im Grunde ist die Methode schon recht human, die komplizierte Logik
if (b3 ^ b2) {
newOne.setBit(1);
}
kann man nicht automatisieren

edit:
es gibt gar in BigInteger eine Methode testBit() ;)

edit2:
> newOne.setBit(3);

BigInteger sind unveränderlich wie Strings, schreibe

newOne = newOne.setBit(3);
 
Zuletzt bearbeitet von einem Moderator:
P

PHANTOMIAS

Aktives Mitglied
Vielen Dank für die Antwort, war sehr hilfreich. Ich habe noch ein wenig umgebaut.

Gruß PHANTOMIAS
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Wie viele 1 an Bits hat die Zahl x? Java Basics - Anfänger-Themen 5
D Erste Schritte Operatoren zur Manipulation von Bits "~" Java Basics - Anfänger-Themen 5
O Einzelne Bits umwandeln und prüfen Java Basics - Anfänger-Themen 23
J Bits zusammen zählen Java Basics - Anfänger-Themen 4
X Datentypen Int oder String in Bits/Bytes umwandeln Java Basics - Anfänger-Themen 10
L Byte[] to String, doch bits sind gespiegelt (MSB/LSB) Java Basics - Anfänger-Themen 3
A Länge einer Hexadezimalzahl in Bits Java Basics - Anfänger-Themen 40
R einzelne Bits prüfen Java Basics - Anfänger-Themen 12
G Datentypen bits, bytes, chars - Verständnisfrage Java Basics - Anfänger-Themen 5
B Wieviele bits belegen die Datentypen? Java Basics - Anfänger-Themen 2
I Bits lesen und schreiben Java Basics - Anfänger-Themen 6
E Division von BigInteger soll Gelitkommazahl liefern Java Basics - Anfänger-Themen 46
K Rekursive Methode für Fakultät mit BigInteger Java Basics - Anfänger-Themen 10
D Wie vergleiche ich zwei BigInteger Werte? Java Basics - Anfänger-Themen 1
TheSorm erstellen von BigInteger Java Basics - Anfänger-Themen 24
A Long in BigInteger Java Basics - Anfänger-Themen 3
R BigInteger zusammensetzen Java Basics - Anfänger-Themen 8
G Methoden BigInteger Zufallszahlen erzeugen Java Basics - Anfänger-Themen 5
G Datentypen BigInteger */: Int Java Basics - Anfänger-Themen 5
B BigInteger , rechen problem Java Basics - Anfänger-Themen 8
M BigInteger mit Decimalzahlen? Java Basics - Anfänger-Themen 5
R Bestimmte Stellen eines BigInteger Java Basics - Anfänger-Themen 7
T String spliten und in BigInteger umwandeln Java Basics - Anfänger-Themen 3
L Compiler-Fehler Fehler bei BigInteger Java Basics - Anfänger-Themen 3
A wurzel von bigInteger Java Basics - Anfänger-Themen 4
A Problem mit BigInteger und Schleife Java Basics - Anfänger-Themen 13
A Schleife mit BigInteger Java Basics - Anfänger-Themen 18
A umwandlung biginteger in int[] Java Basics - Anfänger-Themen 9
P Methode BigInteger-Array übergeben als Referenz Java Basics - Anfänger-Themen 6
D BigInteger potenzieren und anschließend Modulo Java Basics - Anfänger-Themen 7
A BigInteger? Java Basics - Anfänger-Themen 4
K String(ASCII) to BigInteger Java Basics - Anfänger-Themen 2
Z BigInteger Methoden und deren Übergabe Java Basics - Anfänger-Themen 3
G Quersumme berechnen (BigInteger) Java Basics - Anfänger-Themen 3
G array (BigInteger) durchsuchen Java Basics - Anfänger-Themen 2
G BigInteger Java Basics - Anfänger-Themen 6
I BigInteger + Array Java Basics - Anfänger-Themen 4
B BigInteger: Wert per Methode zuweisen Java Basics - Anfänger-Themen 3
G BigInteger zu int Java Basics - Anfänger-Themen 2
Linad Die Methode pow in der BigInteger Klasse Java Basics - Anfänger-Themen 4
N String zu BigInteger Java Basics - Anfänger-Themen 14
G BigInteger und Modulo Java Basics - Anfänger-Themen 3
M brauche Hilfe zu BigInteger Java Basics - Anfänger-Themen 2
C Passwort abprüfen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Anzeige


Oben