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.htmldamit 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.