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

Obliczenia na liczbach binarnych w C++

Object Storage Arubacloud
0 głosów
2,349 wizyt
pytanie zadane 7 maja 2016 w C i C++ przez kkrukowicz Nowicjusz (140 p.)
Witam wszystkich koderów. Mam na studiach kurs pt."Kodowanie 2 Projekt". Moje zadanie polega na stworzeniu kodera oraz dekodera kodu cyklicznego w dowolnym języku programowania. Mój problem polega na tym, że wszystkie obliczenia w tym projekcie chce wykonywać na liczbach binarnych, ale nie znam żadnych prostych sposobów na to w języku C++. Szukałem rozwiązania problemu w Internecie i na forum, ale nic nie znalazłem. Jedyny pomysł jaki przychodzi mi do głowy to przeliczanie liczby binarnej na dziesiętna, przeprowadzenie obliczeń i zamiana z powrotem. Teraz moje główne pytanie do doświadczonych koderów, czy istnieje jakikolwiek sposób w C++ aby zapisywać liczny w systemie binarnym i robienie na nich obliczeń bez żadnych konwersji ??

2 odpowiedzi

0 głosów
odpowiedź 7 maja 2016 przez adrian17 Ekspert (344,860 p.)
edycja 7 maja 2016 przez adrian17
Liczby zawsze przechowywane są binarnie w pamięci. Więcej sensu miałoby pytanie o czytanie / wyświetlanie ich w reprezentacji binarnej.
komentarz 7 maja 2016 przez kkrukowicz Nowicjusz (140 p.)
Masz racje. Ale chodzi mi przede wszystkim o wczytywanie ich w czystej postaci binarnej i operacja na nich też czysto binarnie.
1
komentarz 7 maja 2016 przez adrian17 Ekspert (344,860 p.)

Jakie operacje?

Wczytywanie w sensie z tekstu jest proste:

int x = std::stoi("1001", 0, 2);
std::cout << x; // drukuje 9
std::cout << std::bin << x; // drukuje 1001

 

komentarz 7 maja 2016 przez kkrukowicz Nowicjusz (140 p.)
W sensie wczytuje liczbę 1000000000000 binarnie i chcę podzielić ją binarnie przez 1010110. Wynik chcę również binarnie.
1
komentarz 7 maja 2016 przez adrian17 Ekspert (344,860 p.)

Podzielenie 1000000000000 (4096) przez 1010110 (86) niczym się nie różni od podzielenia 4096 przez 86. Wynikiem będzie 101111 (47).

int main() {
    int x = std::stoi("1000000000000", 0, 2);
    int y = std::stoi("1010110", 0, 2);

    int z = x / y;

    std::cout << std::bitset<8>(z) << "\n"; // drukuje 00101111
}

 

komentarz 7 maja 2016 przez kkrukowicz Nowicjusz (140 p.)
Właśnie o coś takiego mi chodzi, ale jak próbuje uruchomić to w Code::Blocks to wyrzuca mi błąd " 'stoi' is not a member of 'std' " chociaż dodałem bibliotekę <string>.
komentarz 7 maja 2016 przez adrian17 Ekspert (344,860 p.)
Zaznacz tą opcję w projekcie.

http://i.imgur.com/hdMw1eL.png
komentarz 7 maja 2016 przez kkrukowicz Nowicjusz (140 p.)
Próbowałem już tej opcji ale nadal nic.
komentarz 7 maja 2016 przez kkrukowicz Nowicjusz (140 p.)
Dziwna rzecz się dzieje, próbowałem ten kod uruchomić w Dev-C++ i to samo. Nie chce odpalić, ten sam błąd. Nie interpretuje f-cji "stoi" mimo, że wymuszam na kompilatorze stosowanie się do C++ 11.
komentarz 7 maja 2016 przez adrian17 Ekspert (344,860 p.)
Pewnie przerażająco stary kompilator. Najwyżej zastąp std::stoi własną funkcją czytającą stringi zerojedynkowe do liczby.
0 głosów
odpowiedź 8 maja 2016 przez Lithos Nowicjusz (160 p.)
edycja 8 maja 2016 przez Lithos

Może wyciągniesz coś z tego przykładu. Tu zapisujesz liczby z unsigned short i zamienia je Tobie na binarne. Ponadto wykorzystujesz operatory bitowe w połączeniu z 00001111. Może Ci się przyda i coś wymyślisz.

#include <iostream>
#include <bitset>
using namespace std;

int main()
{
	cout << "Podaj liczbe (0 - 255): ";
	unsigned short InputNum = 0;
	cin >> InputNum;

	bitset<8> InputBits (InputNum);
	cout << InputNum << " to binarnie " << InputBits << endl;

	bitset<8> BitwiseNOT = (~InputNum);
	cout << "Logiczne NOT |" << endl;
	cout << "~" << InputBits << " = " << BitwiseNOT << endl;

	cout << "Logiczne AND w połaczeniu z 00001111" << endl;
	bitset<8> BitwiseAND = (0x0F & InputNum);
	cout << "00001111 & " << InputBits << " = " << BitwiseAND << endl;

	cout << "Logiczne OR w połaczeniu z 00001111" << endl;
	bitset<8> BitwiseOR = (0x0F | InputNum);
	cout << "00001111 | " << InputBits << " = " << BitwiseOR << endl;

	cout << "Logiczne XOR w połaczeniu z 00001111" << endl;
	bitset<8> BitwiseXOR = (0x0F ^ InputNum);
	cout << "00001111 ^ " << InputBits << " = " << BitwiseXOR << endl;

	return 0;
} 

Podobne pytania

0 głosów
1 odpowiedź 167 wizyt
pytanie zadane 19 grudnia 2015 w PHP przez shadax Obywatel (1,850 p.)
0 głosów
1 odpowiedź 232 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...