C++ Bitmanipulations-Programm in Java umwandeln

Jiggy

Mitglied
Hallo,
ich wollte folgendes c++ programm in Java umwandeln, habe jedoch kaum Erfahrungen mit Java. Hab mich trotzdem mal daran versucht. Das Programm soll eine Bytekette nehmen und an einer bestimmten Postion der Reihenfolge nach ein Byte umdrehen. Zuerst einmal mein c++ Programm, welches funktioniert.

[XML]#pragma hdrstop
#pragma argsused

#include <tchar.h>
#include <stdio.h>
#include <iostream>


typedef unsigned char byte;

class BitOps1
{
public:

void printBits32(unsigned int wert)
{
int i = 31;
unsigned int bitmaske = 1 << i;

while (i >= 0) {
std::cout << ((wert & bitmaske) >> i);
i --;
bitmaske >>= 1;
}
std::cout << std::endl;;
}

int dreheByte(unsigned int wert, byte pos)
{
int i = 0;
unsigned int erg = 0;
int j = 0;
while (i <= 31) {
unsigned int testmaske = 1 << i;
unsigned int setmaske = 0;
// Testposiotion ab 10. Bit für die nächsten 8 Bit ändern
if (i == pos) {
j=pos+7;
}
if (j>=pos)
{
testmaske = 1 << j;
j--;
}
if (wert & testmaske) {
setmaske = 1 << i;
}
erg = erg | setmaske;
i++;
}
return erg;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
BitOps1 bits;
unsigned int testwert1 = 0xA8F1B5C1;
byte pos = 10;
bits.printBits32(testwert1);
unsigned int erg = bits.dreheByte(testwert1, pos);
bits.printBits32(erg);
return 0;
}[/XML]


Mein Versuch in Java:
Java:
package bitops1;

public class BitOps1 {

   void printBits32(int wert) {
       int i = 31;
       int bitmaske = 65536;
       while (i >= 0) {
           System.out.print((wert & bitmaske) >> i);
           i --;
           bitmaske >>>= 1;
       }
       System.out.println();
   }
   
   int dreheByte(int wert, byte pos) {
  
          int i = 0;
	  int erg = 0;
	  int j = 0;
	   while (i <= 31) {
		 int testmaske = 1 << i;
		 int setmaske = 0;
		 // Testposiotion ab 10. Bit für die nächsten 8 Bit ändern
		 if (i == pos) {
			j=pos+7;
		 }
		 if (j>=pos)
		 {
			testmaske = 1 << j;
			j--;
		 }
		 if (wert & testmaske) {
			setmaske = 1 << i;
		 } 
		 erg = erg | setmaske;
		 i++;
	   }
	   return erg;
       }
   
   
   
    public static void main(String[] args) {
        BitOps1 bits = new BitOps1();
        int testwert1 = 0xA8F1B5C1;
        byte pos1 = 10;
        int erg = bits.dreheByte(testwert1, pos1);
        bits.printBits32(erg);
    }
}

Zeile 33 gibt beim compilieren einen Fehler aus!
Wäre über jegliche Hilfe sehr dankbar!
mfg
 
Nach so was habe ich auch schon in Java gesucht, aber vermutlich geht das nicht, außer das ganze (leider) mit Strings zu machen.
Wäre sehr hilfreich, wenn jemand wüsste, ob so was auch irgendwie anders in Java möglich ist.

edit: Joa klar, so geht's, danke. Hab ich auch gerade schon mal dran gedacht. 😀
 
Zuletzt bearbeitet:
Meinst Du so etwas ?:

Java:
public class BitOps1 {

	public static int dreheByte(int wert, int pos) {
		
		int maskS = 1 << pos;					// Maske zum suchen
		int ret = wert;							// Kopie der übergebenen Bitfolge
		
		if(pos > 22 || pos < 0) return wert;	// Weniger als 8 Bit
		int maskR = 1 << pos+7;					// Maske zum setzen
		
		for(int a=0; a<=7; a++) {
			if((wert & maskS) == maskS)
				ret |= maskR;					// Bit von unten nach oben versetzen
			else
				ret &= ~maskR;					// Die Null nach oben schieben
			
			maskS = maskS << 1;					// Nächstes Bit
			maskR = maskR >> 1;					// Ersetzungsbit eines weiter runter
		}
		return ret;
	}
	
	public static void anzeige(int wert) {

		for(int a=1073741824;a>=1; a=a>>1) {
			if((wert & a) == a)
				System.out.print("1");
			else
				System.out.print("0");
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		
		anzeige(63);
		anzeige(dreheByte(63,4));
	}
}

Handgemacht 🙂
Ich hoffe, ich habe es richtig verstanden.

Pentalon
 
Zuletzt bearbeitet:
Wohl eher
Code:
(wert & testmaske) != 0
.

In Java wird strikt zwischen
Code:
int
und
Code:
boolean
unterschieden.
 
Hi Xehpuk

Was ist der Unterschied zwischen
(wert & testmaske) != 0
und
((wert & maskS) == maskS)

Ich Teste ob ein Bit auf 1 ist. Wenn ja kommt bei der AND Verknüpfung das Bit und wird mit == maskS was das selbe Bit ist geprüft. Was ist hier nicht boolean ??? Erkläre doch bitte etwas genauer, was Du meinst, ich lerne gerne dazu.

Pentalon
 
Warum eigentlich so kompliziert? Okay, vielleicht habe ich nicht ganz verstanden, was der TO will, aber hier mal Code, der ohne Schleifen auskommt:
Java:
	// Diese Variante brauchst du:
	public static int rotByteRight(final int value, final int pos){
		return (value >> 1 & 0xFF << pos) | (value & 0x01 << pos) << 7
			| (value & ~(0xFF << pos));
	}

	// der Vollständigkeit halber:
	public static int rotByteLeft(final int value, final int pos){
		return (value << 1 & 0xFF << pos) | (value & 0x80 << pos) >> 7
			| (value & ~(0xFF << pos));
	}
Theoretisch würde es reichen, diese Methoden static zu machen. (Non-static ist nur dann notwendig, wenn du auch mindestens ein Objekt der Klasse für die Operationen benötigst. Da du aber nur mit int/byte rummachst, und nicht mit BitOps1-Objekten, kann man diese Methoden static machen.) Aber das hängt natürlich davon ab, was für Methoden da noch reinkommen bzw. wo und wie das benutzt werden soll.

Ark
 
Was ist der Unterschied zwischen
(wert & testmaske) != 0
und
((wert & maskS) == maskS)
Es gibt keinen, wenn bei der Maske genau ein Bit gesetzt ist.

Ich bezog mich auf die Lösung von mjdv (nicht auf deine), welche ich damit korrigieren wollte.

Deinen Code habe ich mir gar nicht genauer angeschaut. Mit dem zweiten Satz wollte ich dem Themenersteller nur erklären, wieso er den Compilerfehler erhält. Er wollte schließlich einen
Code:
int
als
Code:
boolean
verwenden, was in Java nicht möglich ist.
 
Es gibt keinen, wenn bei der Maske genau ein Bit gesetzt ist.

Ich bezog mich auf die Lösung von mjdv (nicht auf deine), welche ich damit korrigieren wollte.

Deinen Code habe ich mir gar nicht genauer angeschaut. Mit dem zweiten Satz wollte ich dem Themenersteller nur erklären, wieso er den Compilerfehler erhält. Er wollte schließlich einen
Code:
int
als
Code:
boolean
verwenden, was in Java nicht möglich ist.

Alles klar, dachte irgendwie, das war an mich adressiert 🙂

Pentalon
 
Warum eigentlich so kompliziert? Okay, vielleicht habe ich nicht ganz verstanden, was der TO will, aber hier mal Code, der ohne Schleifen auskommt:
Ark

Wir machen 2 verschiedene Dinge:

Mein Code dreht ein Byte an der angegebenen Stelle im int um:
00001111 vorher
11110000 nachher Bit 0 wird bit 7 Bit 1 wird Bit 6 usw...

Dein Code macht ein Rotate innerhalb eines Bytes ab der bestimmten Position.
00001111 vorher
10000111 nachher (bei rotByteRight)
00011110 nachher (bei rotByteLeft)

Es ist durchaus möglich, dass ich die Aufgabenstellung falsch verstanden habe.
Das wissen wir erst, wenn der TO einen Kommentar dazu abgibt.

Pentalon
 
Wir machen 2 verschiedene Dinge:

Mein Code dreht ein Byte an der angegebenen Stelle im int um […]
Dein Code macht ein Rotate innerhalb eines Bytes ab der bestimmten Position. […]
Es ist durchaus möglich, dass ich die Aufgabenstellung falsch verstanden habe.
Das wissen wir erst, wenn der TO einen Kommentar dazu abgibt.
Stimmt, jetzt, wo du's sagst … ich habe mich zugegebenermaßen nur auf das vom TO gegebene Beispiel verlassen, und da war das tatsächlich mehrdeutig. Mit einem anderen Beispiel habe ich gesehen, dass ich wohl den TO falsch verstanden habe.

Dann also so (hoffentlich richtig ^^):
Java:
	private static byte[] BIT_REVERSE_TABLE = new byte[]{
		(byte)0x00, (byte)0x80, (byte)0x40, (byte)0xC0, (byte)0x20, (byte)0xA0, (byte)0x60, (byte)0xE0,
		(byte)0x10, (byte)0x90, (byte)0x50, (byte)0xD0, (byte)0x30, (byte)0xB0, (byte)0x70, (byte)0xF0,
		(byte)0x08, (byte)0x88, (byte)0x48, (byte)0xC8, (byte)0x28, (byte)0xA8, (byte)0x68, (byte)0xE8,
		(byte)0x18, (byte)0x98, (byte)0x58, (byte)0xD8, (byte)0x38, (byte)0xB8, (byte)0x78, (byte)0xF8,
		(byte)0x04, (byte)0x84, (byte)0x44, (byte)0xC4, (byte)0x24, (byte)0xA4, (byte)0x64, (byte)0xE4,
		(byte)0x14, (byte)0x94, (byte)0x54, (byte)0xD4, (byte)0x34, (byte)0xB4, (byte)0x74, (byte)0xF4,
		(byte)0x0C, (byte)0x8C, (byte)0x4C, (byte)0xCC, (byte)0x2C, (byte)0xAC, (byte)0x6C, (byte)0xEC,
		(byte)0x1C, (byte)0x9C, (byte)0x5C, (byte)0xDC, (byte)0x3C, (byte)0xBC, (byte)0x7C, (byte)0xFC,
		(byte)0x02, (byte)0x82, (byte)0x42, (byte)0xC2, (byte)0x22, (byte)0xA2, (byte)0x62, (byte)0xE2,
		(byte)0x12, (byte)0x92, (byte)0x52, (byte)0xD2, (byte)0x32, (byte)0xB2, (byte)0x72, (byte)0xF2,
		(byte)0x0A, (byte)0x8A, (byte)0x4A, (byte)0xCA, (byte)0x2A, (byte)0xAA, (byte)0x6A, (byte)0xEA,
		(byte)0x1A, (byte)0x9A, (byte)0x5A, (byte)0xDA, (byte)0x3A, (byte)0xBA, (byte)0x7A, (byte)0xFA,
		(byte)0x06, (byte)0x86, (byte)0x46, (byte)0xC6, (byte)0x26, (byte)0xA6, (byte)0x66, (byte)0xE6,
		(byte)0x16, (byte)0x96, (byte)0x56, (byte)0xD6, (byte)0x36, (byte)0xB6, (byte)0x76, (byte)0xF6,
		(byte)0x0E, (byte)0x8E, (byte)0x4E, (byte)0xCE, (byte)0x2E, (byte)0xAE, (byte)0x6E, (byte)0xEE,
		(byte)0x1E, (byte)0x9E, (byte)0x5E, (byte)0xDE, (byte)0x3E, (byte)0xBE, (byte)0x7E, (byte)0xFE,
		(byte)0x01, (byte)0x81, (byte)0x41, (byte)0xC1, (byte)0x21, (byte)0xA1, (byte)0x61, (byte)0xE1,
		(byte)0x11, (byte)0x91, (byte)0x51, (byte)0xD1, (byte)0x31, (byte)0xB1, (byte)0x71, (byte)0xF1,
		(byte)0x09, (byte)0x89, (byte)0x49, (byte)0xC9, (byte)0x29, (byte)0xA9, (byte)0x69, (byte)0xE9,
		(byte)0x19, (byte)0x99, (byte)0x59, (byte)0xD9, (byte)0x39, (byte)0xB9, (byte)0x79, (byte)0xF9,
		(byte)0x05, (byte)0x85, (byte)0x45, (byte)0xC5, (byte)0x25, (byte)0xA5, (byte)0x65, (byte)0xE5,
		(byte)0x15, (byte)0x95, (byte)0x55, (byte)0xD5, (byte)0x35, (byte)0xB5, (byte)0x75, (byte)0xF5,
		(byte)0x0D, (byte)0x8D, (byte)0x4D, (byte)0xCD, (byte)0x2D, (byte)0xAD, (byte)0x6D, (byte)0xED,
		(byte)0x1D, (byte)0x9D, (byte)0x5D, (byte)0xDD, (byte)0x3D, (byte)0xBD, (byte)0x7D, (byte)0xFD,
		(byte)0x03, (byte)0x83, (byte)0x43, (byte)0xC3, (byte)0x23, (byte)0xA3, (byte)0x63, (byte)0xE3,
		(byte)0x13, (byte)0x93, (byte)0x53, (byte)0xD3, (byte)0x33, (byte)0xB3, (byte)0x73, (byte)0xF3,
		(byte)0x0B, (byte)0x8B, (byte)0x4B, (byte)0xCB, (byte)0x2B, (byte)0xAB, (byte)0x6B, (byte)0xEB,
		(byte)0x1B, (byte)0x9B, (byte)0x5B, (byte)0xDB, (byte)0x3B, (byte)0xBB, (byte)0x7B, (byte)0xFB,
		(byte)0x07, (byte)0x87, (byte)0x47, (byte)0xC7, (byte)0x27, (byte)0xA7, (byte)0x67, (byte)0xE7,
		(byte)0x17, (byte)0x97, (byte)0x57, (byte)0xD7, (byte)0x37, (byte)0xB7, (byte)0x77, (byte)0xF7,
		(byte)0x0F, (byte)0x8F, (byte)0x4F, (byte)0xCF, (byte)0x2F, (byte)0xAF, (byte)0x6F, (byte)0xEF,
		(byte)0x1F, (byte)0x9F, (byte)0x5F, (byte)0xDF, (byte)0x3F, (byte)0xBF, (byte)0x7F, (byte)0xFF,
	};

	public static int reverse8Bits(final int value, final int pos){
		return (BIT_REVERSE_TABLE[value >> pos & 0xFF] & 0xFF) << pos
			| (value & ~(0xFF << pos));
	}

Ark
 

Neue Themen


Zurück
Oben