Witam czy ktos moglby mi pomoc w programie ktory wypisywalby n ty wyraz liczby zapisanej w sposob binarny? Nie wiem nawet jak matematycznie to zapisac. To znaczy same liczby potrafie, ale operacje wyczytywania ntej liczby w liczbie juz nie.
Będzie ciężko pomóc, bo nie wiemy o co Ci chodzi. Liczba nie składa się z wyrazów tylko cyfr. Podaj może przykładowe wejście, wyjście z programu i kod, jak próbujesz to rozwiązać.
n ty wyraz liczby zapisanej w sposob binarny
Czyli np. dla liczby binarnej 1010101001101
czwartym wyrazem tej liczby jest (?)
Zakładam, że przez n ty wyraz liczby
i nta liczba w liczbie
rozumiesz nty bit liczby
.
Najprostszym podejściem będzie użycie std::bitset<>, ale patrząc na treść zadania i to, że masz dwa posty zakładam, że dostałaś to w szkole i użycie bitset<>
będzie za dużym szokiem dla nauczyciela.
Dobrze kombinujesz, musisz użyć przesunięć bitowych. Pokaż kod, który napisałaś do tej pory, to będziemy mogli zobaczyć co skopałaś.
Wystarczy chyba wykonać right shift o numer bitu, jaki chcemy dostać, dla longa od 0
do 63
i zrobić bitwise AND
tego z jedynką.
polka123 napisał(a):
... ale operacje wyczytywania ntej liczby w liczbie juz nie.
Gdzieś koło pierwszej-drugiej klasy dziecko ma pogląd, czym się różni liczba od cyfry
stryku napisał(a):
Najprostszym podejściem będzie użycie ...
Dobrze kombinujesz, musisz użyć ...
Zakładasz, że rozumiesz o co chodzi?
pewnie chodzi o coś takiego lub podobnego:
std::bitset<32>{x}.test(32-n);
Możesz to zrobić na dwa sposoby:
W przykładzie poniżej bity pobierane są od prawej do lewej strony. Jeżeli chcesz wykorzystać kod w swoim zadaniu musisz zmienić kierunek na przeciwny.
Powodzenia.
// C++17
#include <iostream>
#include <bitset>
#include <limits>
#include <optional>
using namespace std;
auto getNthBitOfNumber( int number , int nth )
{
const auto max_digit { numeric_limits<int>::digits };
return ( nth>max_digit || nth<1 ) ? nullopt : make_optional<string>( bitset<max_digit>(number).test(nth-1)?"1"s:"0"s );
}
auto getNthBitOfNumberWithBitShift( int number , int nth )
{
const int mark {1<<(nth-1)};
return ( mark>number || nth<1 ) ? "Out of number range."s : (mark&number) == 0 ? "0"s :"1"s;
}
int main()
{
cout << getNthBitOfNumber(4567,5).value_or("Out of number range.") << endl;
cout << getNthBitOfNumberWithBitShift(4567,5) << endl;
}
Możesz to zrobić na dwa sposoby
Niekoniecznie, można też zwykłą toporną pętlą, też od prawej do lewej:
int get_nth_bit(int number, int position /* 0 - 31 */) {
while (position--) {
number /= 2;
}
return number % 2;
}
int main()
{
// 12 = 0b1100
std::cout << get_nth_bit(12, 0) << "\n"; // 0
std::cout << get_nth_bit(12, 1) << "\n"; // 0
std::cout << get_nth_bit(12, 2) << "\n"; // 1
std::cout << get_nth_bit(12, 3) << "\n"; // 1
return 0;
}
po co te biblioteki:#include <bitset>
#include <limits>
#include <optional>? nie znam ich za bardzo
#include <iostream>
#include<stdlib.h>
using namespace std;
int wartoscbitu(int liczba,int n)
{
if(n<0)
{
return 0;
}
int potega=2^n;
if((liczba&potega)!=0)
{
return 1;
}
else
return 0;
}
int main()
{
cout<< wartoscbitu(2,0);
}
ja zrobilam cos takiego, dziekuje za podeslanie "gotowcow ale czy bylby ktos tak uprzejmy i moglby zobaczyc gdzie tu w moim rozumowaniu jest blad? Nie moge go znalezc i program nie dziala poprawnie
int potega=2^n;
Poczytaj o operatorach bitowych, to nie jest potęgowanie. Jeśli już, to chcesz użyć 1 << n
aby zapalić n-ty bit.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.