Binäre zahl und (little und big endian machine )



  • Hi Leute,

    Ich brauche Hilfe!!!!!!!!!!!!!!!!!!!

    Ich muss eine binäre Zahl bearbeiten:

    1 0 0 0 1 1 1 1 0 0 1 0 (2290)

    Ich muss von rechts nach links lesen:

    zuerst:01 dann 10 dann 00 dann 01 dann 11 usw. die letzte ist 01;

    Und zweite Frage:

    wie kann Ich den Unterschied zwischen big und little endian machine machen?
    wie kann Ich das in ANSI C implementieren?

    Im Voraus Vielen Dank

    Viele Grüsse
    lena



  • was war deine erste frage nochmal?

    ob die CPU little-endian ist, sollte so herauszufinden sein (ohne gewaehr):

    if ((long)0x01 & (char)0x01)
        puts("little endian");
    else
        puts("big endian");
    


  • Vielen Dank für deinen Antwort.

    Meine erste Frage war :

    Ich habe zum Beispiel ein binäre zahl 2290: 1 0 0 0 1 1 1 1 0 0 1 0 ;

    Ich muss die wahrscheinlichkeit berechnen:
    wie oft kommt nach 00 eine 1
    wie oft kommt nach 00 eine 0 und
    wie oft kommt nach 01 eine 1
    wie oft kommt nach 01 eine 0 und
    wie oft kommt nach 10 eine 1
    wie oft kommt nach 10 eine 0 und
    wie oft kommt nach 11 eine 1
    wie oft kommt nach 11 eine 0.

    Ich muss von rechts nach links lesen:

    1 0 0 0 1 1 1 1 0 0 1 0
    <---
    1 0 0 0 1 1 1 1 0 0 1 0
    <--
    1 0 0 0 1 1 1 1 0 0 1 0
    <--
    1 0 0 0 1 1 1 1 0 0 1 0
    <--

    zuerst:01 dann 10 dann 00 dann 01 dann 11 usw. die letzte ist 01;

    Wie kann Ich das machen ?

    Und noch eine Frage:
    Wie kehre Ich diese binäre folge um:

    1 0 0 0 1 1 1 1 0 0 1 0 - > 0 1 0 0 1 1 1 1 0 0 0 1

    Im Voraus Vielen Dank

    Viele Grüsse
    lena



  • ganz einfach mit einem for loop.
    vorher musst du natuerlich den string einlesen.

    hast du grundlagen?



  • Vielen dank für deine Antwort!!!

    /*
    ganz einfach mit einem for loop.
    vorher musst du natuerlich den string einlesen. */

    Wie mache Ich das ?



  • so:
    http://www.pronix.de/pronix-4.html

    damit will ich sagen, dass ich keine lust habe, dir grundlagen einzutrichtern.



  • c.rackwitz schrieb:

    was war deine erste frage nochmal?
    ob die CPU little-endian ist, sollte so herauszufinden sein (ohne gewaehr):

    if ((long)0x01 & (char)0x01)
        puts("little endian");
    else
        puts("big endian");
    

    ROFL. Der war gut. Aehmm du weisst schon das Big-Indian und
    Little Indian auf Byteebene identisch sind, oder?

    Im übrigen kann das gar nicht funktionieren, da Du vorher
    schon brav einen cast machst!



  • Versuche Folgendes:

    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
    	union
    	{
    		short s;
    		char c[sizeof(short)];
    	} un;
    
    	un.s = 0x0102;
    
    	if ( sizeof(short) == 2 )
    		if ( un.c[0] == 1 && un.c[1] == 2 )
    			printf("big-endian\n");
    		else if ( un.c[0] == 2 && un.c[1] == 1 )
    			printf("little-endian\n");
    		else
    			printf("unknown\n");
    	else
    		printf("sizeof(short) = %d\n", sizeof(short));
    
    return 0;
    }
    


  • nemeses schrieb:

    ROFL. Der war gut. Aehmm du weisst schon das Big-Indian und
    Little Indian auf Byteebene identisch sind, oder?

    Im übrigen kann das gar nicht funktionieren, da Du vorher
    schon brav einen cast machst!

    beweise mir, dass es nicht geht, oder gib mir shell und gcc auf einer box mit big endian.



  • ich denke auch, daß es nicht funktioniert. schließlich handelt es sich bei ((long)0x01 & (char)0x01) um einen konstanten ausdruck der keine daten im speicher ablegt. wenn das funktionieren würde, dann hieße das ja, daß das ergebnis von arithmetisch-logischen operationen vom endiansystem abhinge!

    ich würde es so machen:

    int x=1;
    if(*(char*)&x)
      printf("intel\n");    // ich kann mir nie merken,
    else                    // ob intel big oder little endian ist ;)
      printf("motorola\n");
    

    immer vorausgesetzt, daß sizeof(int)>1 ist und daß der compiler das nicht optimiert.


Anmelden zum Antworten