Jump to content
BulForum.com

Има ли отворени?


sasquatch

Recommended Posts

Имаме функция на 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

  • Replies 50
  • Created
  • Last Reply

Побитовото изместване не е по 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

Побитовото изместване не е по i, а по 1<<i :

Мда, вчера доста си блъсках главата, и днес като станах се сетих че проблема е че не трябва да се измества на i а на 2^i. Между другото това #include <stdint.h> предполагам ще върви с GNU C ама не и с MS C :) В смисъл няма такъв хедър в MS VC++ а аз с него програмирам в момента.

Link to comment
Share on other sites

Така би изглеждало на асемблер за 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

Така би изглеждало на асемблер за PIC16 :)

       movwf  inp
      movlw  8
      movwf  count
      rlf     inp,f
      rrf     out,f
      decfsz  count,f
      goto   $-3
      movfw  out

Влизаш с числото във Wreg и ислизаш с резултата пак във Wreg

Доста странен асемблер, аз си мислех че на асемблер за ПЦ работата може да стане само с въртене през флага за пренос (поправка само въртене), но в случая се изискваше да се дебъгне тая C функция. Между другото това е задача от тест на microsoft :)

@rasco - аз докато го напиша тва и ти вече го беше постнал - да не мичетеш мислите :)

Link to comment
Share on other sites

:) Аз затова го постнах тоя асемблер, щото не можах да захапя за 86 (не съм писал от две години), пък сега главно с тоя асемблер се тровя, но важното е идеята ;)
Link to comment
Share on other sites

ror a

rol  b

и така осем пъти и си готов :)

Едно въпросче - ror през флага за пренос ли върти или не?

Link to comment
Share on other sites

Айде , нова задачка - да се напише функция която да връща петия елемент от края на едносвързан списък. Списъка да се обхожда само един път.

Link to comment
Share on other sites

Ето един бърз отговор. Не съм го тествал, но ми изглежда като разумно решение.

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

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

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

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.

 

#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

#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;
}

 

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

Мда , сигурно има нещо по-хитро от brute force :) Аз в момента съм се затегнал с една друга задача за двусвързано дърво дето си е е.м., като я реша ще я постна.

Link to comment
Share on other sites

Не хакер - програмист :P

"Не човек, а желязо!"...казал непросветения (като мен). :P

Брей...издигнахте ми се в очите, откак следя темата....разни сложни термини...ама се разбирате помежду си, следователно - не лъжете. :D

То и аз поназнайвах малко асемблер от времето на Правец 8, ама като гледам нещата доста са се развили от тогава. Дерзайте, юнаци! :punk

To tva e zadacha, koqto v bg se dava na uchenici 7-8 klas:)

Аз тия 2-та ги изпуснах навремето, язък...не е трябвало значи... :D

Link to comment
Share on other sites

"Не човек, а желязо!"...казал непросветения (като мен). :P

Брей...издигнахте ми се в очите, откак следя темата....разни сложни термини...ама се разбирате помежду си, следователно - не лъжете. :D

То и аз поназнайвах малко асемблер от времето на Правец 8, ама като гледам нещата доста са се развили от тогава. Дерзайте, юнаци! :punk

To tva e zadacha, koqto v bg se dava na uchenici 7-8 klas:)

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.


×
×
  • Create New...