• 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++

VPS Starter Arubacloud
0 głosów
2,302 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,100 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,100 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,100 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,100 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,100 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ź 162 wizyt
pytanie zadane 19 grudnia 2015 w PHP przez shadax Obywatel (1,850 p.)
0 głosów
1 odpowiedź 227 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...