• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z negacją

0 głosów
564 wizyt
pytanie zadane 16 listopada 2015 w C i C++ przez dYstans Początkujący (270 p.)
 for(int i=0;i<bits;i++){
        if(*(nM+i)==1){
              *(nM+i)-=1;
        }else{
            *(nM+i)+=1;
            }
  }

Chciałbym zanegować kazdą liczbe.

Dla nM(chary)=0101, bits = dlugosc lancucha znakow

Wyświetla mi 1212, a chciałbym 1010.

Jakieś pomysły?

5 odpowiedzi

+1 głos
odpowiedź 17 listopada 2015 przez draghan VIP (106,230 p.)

Używasz tagów C++ i nagłówków C++, a piszesz jak w C. :)

Po co ręcznie tworzysz tablice znaków, skoro masz dedyowany wygodny typ łańcuchowy?

Realizacja negacji na takim łańcuchu jest banalna.

#include <iostream>
#include <string>

std::string neguj(const std::string &liczba)
{
    std::string zanegowana;
    for(auto &znak : liczba)
    {
        if(znak == '1') zanegowana += '0';
        else if(znak == '0') zanegowana += '1';
        else zanegowana = ""; // nie podano poprawnego łańcucha, więc nie neguję nic
    }
    return zanegowana;
}

int main()
{
    std::string liczba = "1011";
    std::cout<<liczba<<"\n"<<neguj(liczba);
    return 0;
}

Ale nasuwa się pytanie: dlaczego dla ciągów bitów używasz tablic znaków? Ja na Twoim miejscu użyłbym co najwyżej tablicy wartości bool. Być może vectora, żeby nie martwić się o ręczną alokację.
Polecam Ci również zaznajomić się z klasą bitset, która została stworzona po to, aby manipulować ciągami bitów.

0 głosów
odpowiedź 16 listopada 2015 przez criss Mędrzec (172,570 p.)
Troche za mało kodu podałeś, żebym coś z tego odczytał. Ale żeby zanegować char, wystarczy że odejmiesz wartosć char od 255.
0 głosów
odpowiedź 16 listopada 2015 przez Rogargol Pasjonat (16,610 p.)
A jakbys uzyl operatora negacji '!' ?
0 głosów
odpowiedź 16 listopada 2015 przez Sebastian Fojcik Nałogowiec (43,040 p.)
edycja 16 listopada 2015 przez Sebastian Fojcik

Niepotrzebnie bawisz sie w dodawanie i odejmowanie. Spróbuj po prostu zamieniać 1 na 0 i 0 na 1:

for( int i = 0; i<bits; i++ )
{
    if( *(nM + i) == 1 )
    {
        *(nM + i) = 0;
    }
    else
    {
        *(nM + i) = 1;
    }
}

Jeżeli działamy na zerach lub jedynkach, można posłużyć się operatorem logicznym '!'. Zwraca prawdę (1) lub fałsz (0). Neguje 1 na 0 lub 0 na 1. Czyli kod wyglądałby tak:

for( int i = 0; i<bits; i++ )
{
	*(nM + i) = !*(nM + i);
}

Czyż nie wygląda to piękniej? :-D

PS. Tak przy okazji. Twój zapis *(nM+1) jest, mówiąc delikatnie: katastroficzny. Po to wymyślono operatory [ ], aby z nich korzystać. Kod ma być czytelny.

for( int i = 0; i<bits; i++ )
{
	nM[ i ] = !nM[ i ];
}

No teraz, to jest po prostu bajlando :-D

komentarz 16 listopada 2015 przez dYstans Początkujący (270 p.)

niestety nie pomogło...
Ja jestem zdania że kadzy pisze jak mu jest wygodnie, komentarze są od wyjaśnień, np. Dla mnie tak jest wygodnie i przejrzyście.

0 głosów
odpowiedź 16 listopada 2015 przez dYstans Początkujący (270 p.)

Dodam cały kod dla lepszego zrozumienia problemu...

Jest to Algorytm Boolth'a, a przynajmniej próbuje żeby był:

#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;
//...............................................
char* booth(char *a,char *b,int bits){
  int x=1;
  char q={'0'},temp={'0'};
  char *M=b, *nM=b;

  cout<<"\n------------------------------------"<<endl;
  cout << "Przed negacja: "<< nM;
  cout<<"\n------------------------------------"<<endl;

  for(int i=0;i<bits;i++){
      nM[ i ] = !nM[ i ];
  }

  cout <<"Po nM: " << nM;

  cout<<"\n------------------------------------"<<endl;

  for(int i=0;i<bits;i++){cout<<"0";}
  cout<<"\t"<<b<<"\t"<<q<<"\tM="<<a<<endl;
  cout<<a<<"\t"<<b<<"\t"<<q<<endl;
do{
  if(q==*(b+bits-1))
  {
      temp=*(a+bits-1);
      for(int i=bits-1;i>0;i--)
        {
        *(a+i)=*(a+i-1);
        }
        q=*(b+bits-1);
        for(int i=bits-1;i>0;i--)
        {
        *(b+i)=*(b+i-1);
        }
        *(b+0)=temp;
        cout<<a<<"\t"<<b<<"\t"<<q<<endl;
  }else if(q>*(b+bits-1)){

      for(int i=bits-1;i>0;i--){
        *(b+i)+*(M+i);
        if(*(b+i)>1){
           *(b+i)=0;
           *(b+i+1)+=1;
           }else if(*(b+0)>1){
               *(b+0)=0;
           }
        }
      cout<<a<<"\t"<<b<<"\t"<<q<<endl;
    }/*else{
          for(int i=bits-1;i>0;i--){
            *(b+i)+*(nM+i);
            if(*(b+i)>1){
            *(b+i)=0;
            *(b+i+1)+=1;
            }else if(*(b+0)>1){
               *(b+0)=0;
           }
        }
      cout<<a<<"\t"<<b<<"\t"<<q<<endl;
    }*/
  x++;
  }while(x!=bits);
}
//...............................................
int main(){
  int bity;
  cout << "\nPodaj ilosc bitów: ";
  cin >> bity;
  char *tab1, *tab2, *wynik;

  tab1=(char *)calloc(bity+1,sizeof(char));
  tab2=(char *)calloc(bity+1,sizeof(char));

  cout << "\nPodaj pierwsza liczbe w kodzie U2: ";
  cin>>tab1;
  tab1=tab1+'\0';
  cout << "\nliczba1: " << tab1 <<endl;

  cout << "\nPodaj druga liczbe liczbe w kodzie U2: ";
  cin>>tab2;
  tab2=tab2+'\0';
  cout << "\nliczba2: " << tab2 <<endl;

  wynik=booth(tab1,tab2,bity);

  return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 601 wizyt
pytanie zadane 22 stycznia 2016 w C i C++ przez konrad99 Gaduła (4,090 p.)
0 głosów
0 odpowiedzi 337 wizyt
0 głosów
1 odpowiedź 360 wizyt
pytanie zadane 12 listopada 2016 w Java przez qwerty Początkujący (380 p.)

93,778 zapytań

142,737 odpowiedzi

323,390 komentarzy

63,382 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...