sasquatch Posted October 1, 2004 Share Posted October 1, 2004 Имаме функция на C++, тя обръща битовете на дадено число наопъки, ако и дадем за вход 0xD1 трябва да върне 0x8B но в нея има бъг ... typedef unsigned char BYTE; BYTE MirrorBits ( BYTE B ) { BYTE mask [] = {0xAA, 0xCC, 0xF0}; int i; for (i = 0; i < sizeof(mask)/sizeof(BYTE); i++) { b = ((b & mask) >> i) | ((b & ~mask) << i); } return b; } Link to comment Share on other sites More sharing options...
dinux Posted October 2, 2004 Share Posted October 2, 2004 Побитовото изместване не е по i, а по 1<<i : #include <stdint.h> uint8_t mirror_bits( uint8_t b ) { uint8_t mask[] = {0xaa, 0xcc, 0xf0}; int i; for(i=0; i<sizeof(mask)/sizeof(uint8_t); i++) { b = ((b&mask[i]) >> (1<<i)) | ((b&~mask[i]) << (1<<i)); } return b; } Link to comment Share on other sites More sharing options...
sasquatch Posted October 2, 2004 Author Share Posted October 2, 2004 Побитовото изместване не е по i, а по 1<<i : Мда, вчера доста си блъсках главата, и днес като станах се сетих че проблема е че не трябва да се измества на i а на 2^i. Между другото това #include <stdint.h> предполагам ще върви с GNU C ама не и с MS C В смисъл няма такъв хедър в MS VC++ а аз с него програмирам в момента. Link to comment Share on other sites More sharing options...
бат Ицо Posted October 2, 2004 Share Posted October 2, 2004 Така би изглеждало на асемблер за PIC16 movwf inp movlw 8 movwf count rlf inp,f rrf out,f decfsz count,f goto $-3 movfw out Влизаш с числото във Wreg и ислизаш с резултата пак във Wreg Link to comment Share on other sites More sharing options...
rasco Posted October 2, 2004 Share Posted October 2, 2004 използвай inline assembly: BUL$HIT$ хем по чисто,хем по лесно, с асемблер е чудесно Link to comment Share on other sites More sharing options...
sasquatch Posted October 2, 2004 Author Share Posted October 2, 2004 Така би изглеждало на асемблер за PIC16 movwf inp movlw 8 movwf count rlf inp,f rrf out,f decfsz count,f goto $-3 movfw out Влизаш с числото във Wreg и ислизаш с резултата пак във Wreg <{POST_SNAPBACK}> Доста странен асемблер, аз си мислех че на асемблер за ПЦ работата може да стане само с въртене през флага за пренос (поправка само въртене), но в случая се изискваше да се дебъгне тая C функция. Между другото това е задача от тест на microsoft @rasco - аз докато го напиша тва и ти вече го беше постнал - да не мичетеш мислите Link to comment Share on other sites More sharing options...
бат Ицо Posted October 2, 2004 Share Posted October 2, 2004 Аз затова го постнах тоя асемблер, щото не можах да захапя за 86 (не съм писал от две години), пък сега главно с тоя асемблер се тровя, но важното е идеята Link to comment Share on other sites More sharing options...
rasco Posted October 2, 2004 Share Posted October 2, 2004 само че като се разсъних видях, че така нищо не става като го измисля ще пиша Link to comment Share on other sites More sharing options...
бат Ицо Posted October 2, 2004 Share Posted October 2, 2004 само че като се разсъних видях, че така нищо не става като го измисля ще пиша <{POST_SNAPBACK}> ror a rol b и така осем пъти и си готов Link to comment Share on other sites More sharing options...
sasquatch Posted October 2, 2004 Author Share Posted October 2, 2004 ror arol b и така осем пъти и си готов <{POST_SNAPBACK}> Едно въпросче - ror през флага за пренос ли върти или не? Link to comment Share on other sites More sharing options...
бат Ицо Posted October 2, 2004 Share Posted October 2, 2004 Ами май че да, то иначе няма да стане, ама май афектираше CF и OF Link to comment Share on other sites More sharing options...
sasquatch Posted October 2, 2004 Author Share Posted October 2, 2004 Айде , нова задачка - да се напише функция която да връща петия елемент от края на едносвързан списък. Списъка да се обхожда само един път. Link to comment Share on other sites More sharing options...
dinux Posted October 3, 2004 Share Posted October 3, 2004 Ето един бърз отговор. Не съм го тествал, но ми изглежда като разумно решение. typedef struct { int data; list_t *next; } list_t; list_t * get_fifth(list *t b) { list_t *p=b, *fifth=b; int i=0; while(p->next != NULL) { if(i<5) { i++; } else { fifth = fifth->next; } p = p->next; } return i==5 ? fifth : NULL; } Link to comment Share on other sites More sharing options...
sasquatch Posted October 3, 2004 Author Share Posted October 3, 2004 struct ListElement { int value; ListElement * next; ListElement(){ this->value = 0; this->next = 0; }; ListElement(int value){ this->value = value; this->next = 0; }; }; ListElement * getTheFifthElementV3(ListElement * head) { ListElement *p=head, *fifth=head; int i=0; while(p != NULL) { if(i<5) { i++; } else { fifth = fifth->next; } p = p->next; } if(i>=5) return fifth; else return NULL; } Малко го преработих твоя вариант и сега работи, идеята е добра, но това fifth = fifth->next; си е малко като второ обхождане на списъка. Аз иначе ето така я бях написал функцията ListElement * getTheFifthElementV2(ListElement * head){ if(!head) return NULL; ListElement * pointers[]={NULL, NULL, NULL, NULL, NULL}; pointers[4] = head; head = head->next; while(head){ for(short i = 0;i<4;i++) pointers[i] = pointers[i+1]; pointers[4] = head; head = head->next; } return pointers[0]; } Както се вижда от profiler-а Func Func+Child Hit Time % Time % Count Function --------------------------------------------------------- 274,873 9,3 274,873 9,3 1 getTheFifthElementV2(struct ListElement *) (list_of_ints.obj) 273,563 9,3 273,563 9,3 1 getTheFifthElementV3(struct ListElement *) (list_of_ints.obj) Времената са сходни общо взето, за сега си напред с една ms (тествам функциите със списък с 5000000 елемента). На списък с 50000000 елемента : Func Func+Child Hit Time % Time % Count Function --------------------------------------------------------- 73402,936 27,3 73402,936 27,3 1 getTheFifthElementV2(struct ListElement *) (list_of_ints.obj) 72261,520 26,9 72261,520 26,9 1 getTheFifthElementV3(struct ListElement *) (list_of_ints.obj) Link to comment Share on other sites More sharing options...
JDFU Posted October 3, 2004 Share Posted October 3, 2004 Myrzi ma da pisha po pyrvite zadachi ma smqtam za sledvashtite da se vkliucha. Eto edna i ot men (mnoo lesna ma inache mnoo ma kefi) : Davat vi se 2*x+1 chisla (x < 10000000), ot koito x se povtarqt po 2 pyti i ima edno koeto ne se povtarq. Namerete koe e chisloto. Link to comment Share on other sites More sharing options...
dinux Posted October 3, 2004 Share Posted October 3, 2004 Davat vi se 2*x+1 chisla (x < 10000000), ot koito x se povtarqt po 2 pyti i ima edno koeto ne se povtarq. Namerete koe e chisloto. <{POST_SNAPBACK}> #include <stdlib.h> static int compare(const void *a, const void *b) { int n1,n2; n1 = *((int*)a); n2 = *((int*)b); if(n1<n2) { return -1; } else if(n1==n2) { return 0; } else { return 1; } } int get_unique( int *buf, int x) { qsort( buf, n, sizeof(int), compare); while(x-- > 0) { if( *buf != *(buf+1) ) { break; } buf += 2; } return *buf; } EDIT: Баси, наистина било елементарно. int get_unique( int *buf, int x) { int i,n; for(i=n=0; i<(2*x+1); i++) n ^= *buf++; return n; } Link to comment Share on other sites More sharing options...
JDFU Posted October 3, 2004 Share Posted October 3, 2004 #include <stdlib.h> static int compare(const void *a, const void *b) { int n1,n2; n1 = *((int*)a); n2 = *((int*)b); if(n1<n2) { return -1; } else if(n1==n2) { return 0; } else { return 1; } } int get_unique( int *buf, int x) { qsort( buf, n, sizeof(int), compare); while(x-- > 0) { if( *buf != *(buf+1) ) { break; } buf += 2; } return *buf; } <{POST_SNAPBACK}> mnogo si brutalen be... ima mnogo po eleganten nachin, ama she izchakam malko, ako nqkoi drug iska da se probva! Link to comment Share on other sites More sharing options...
sasquatch Posted October 3, 2004 Author Share Posted October 3, 2004 Мда , сигурно има нещо по-хитро от brute force Аз в момента съм се затегнал с една друга задача за двусвързано дърво дето си е е.м., като я реша ще я постна. Link to comment Share on other sites More sharing options...
JDFU Posted October 4, 2004 Share Posted October 4, 2004 Davat vi se 2*x+1 chisla (x < 10000000), ot koito x se povtarqt po 2 pyti i ima edno koeto ne se povtarq. Namerete koe e chisloto. <{POST_SNAPBACK}> Samo da dobavq che chislata sa integer!!!! Link to comment Share on other sites More sharing options...
бат Ицо Posted October 4, 2004 Share Posted October 4, 2004 Samo da dobavq che chislata sa integer!!!! <{POST_SNAPBACK}> Не ми се пише програма, ама на един цикъл става xor Link to comment Share on other sites More sharing options...
JDFU Posted October 4, 2004 Share Posted October 4, 2004 Не ми се пише програма, ама на един цикъл става xor <{POST_SNAPBACK}> hakeeeer Mda taka sa prai Link to comment Share on other sites More sharing options...
бат Ицо Posted October 4, 2004 Share Posted October 4, 2004 Не хакер - програмист Link to comment Share on other sites More sharing options...
Midex Posted October 4, 2004 Share Posted October 4, 2004 Не хакер - програмист "Не човек, а желязо!"...казал непросветения (като мен). Брей...издигнахте ми се в очите, откак следя темата....разни сложни термини...ама се разбирате помежду си, следователно - не лъжете. То и аз поназнайвах малко асемблер от времето на Правец 8, ама като гледам нещата доста са се развили от тогава. Дерзайте, юнаци! To tva e zadacha, koqto v bg se dava na uchenici 7-8 klas:) Аз тия 2-та ги изпуснах навремето, язък...не е трябвало значи... Link to comment Share on other sites More sharing options...
JDFU Posted October 4, 2004 Share Posted October 4, 2004 "Не човек, а желязо!"...казал непросветения (като мен). Брей...издигнахте ми се в очите, откак следя темата....разни сложни термини...ама се разбирате помежду си, следователно - не лъжете. То и аз поназнайвах малко асемблер от времето на Правец 8, ама като гледам нещата доста са се развили от тогава. Дерзайте, юнаци! <{POST_SNAPBACK}> To tva e zadacha, koqto v bg se dava na uchenici 7-8 klas:) Link to comment Share on other sites More sharing options...
бат Ицо Posted October 4, 2004 Share Posted October 4, 2004 Нормално - изгубеното време беше само докато прочета условието Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.