Wypisanie bitów wartości

0

Wejście: n (8-bitowa liczba całkowita z przedziału [-128, 127] )
Wyjście: 8 bitów liczby n w postaci kodów ASCII '0' lub '1'
Lista kroków:
K01: CZYTAJ n
K02: JEŻELI n ⩾ -128 I n⩽ 127 WYKONAJ
K03: bit_8 ← chr(uint(n)) MOD 2 + 48)
K03: bit_7 ← chr(uint(n)/2^1) MOD 2 + 48)
K03: bit_6 ← chr(uint(n)/2^2) MOD 2 + 48)
K03: bit_5 ← chr(uint(n)/2^3) MOD 2 + 48)
K03: bit_4 ← chr(uint(n)/2^4) MOD 2 + 48)
K04: bit_3 ← chr(uint(n)/2^5) MOD 2 + 48)
K05: bit_2 ← chr(uint(n)/2^6) MOD 2 + 48)
K06: JEŻELI n<0 WYKONAJ
K07: bit_1 ← '1'
K08: W PRZECIWNYM RAZIE
K09: bit_1 ← '0'
K10: WYPISZ bit_1 + bit_2 + bit_3 + bit_4 + bit_5 + bit_6 + bit_7 + bit_8 + ' '↵'
K11: ZAKOŃCZ

Witam, czy mógłby ktoś napisać prawidłowy zapis od K03 do K05?

0

Bit 5, resztę sobie dopisz:

char bit_5 = !!(n & (1 << 4)) + '0';

Ta czwórka to nie błąd, traktuj to jako 5-1 dla bitu 5.

0

@kq: Nie do końca chyba o to chodziło, ponieważ masz zgodnie z instrukcją napisać. Na samym końcu ma być modulo 2 + 48

0

'0' to 48 w ascii, tylko przenośne i czytelne względem zamiaru. Jak chcesz kropka w kropkę zgodnie z instrukcją to proszę: (chociaż to dość dziwnie wygląda):

char bit_5 = (unsigned(n) / (1 << 4)) % 2 + 48;

Swoją drogą, możesz użyć po prostu std::bitset.

0

@kq: A bez tego przesunięcia bitowego z dzieleniem przez potęgowanie?

0

Przesunięcie bitowe 1 to jest potęgowanie dla danej podstawy (np 2). Możesz sobie napisać funkcję potęgującą, albo stablicować kolejne potęgi 2, ale to bez sensu. Ewentualnie zacznij od 1 i w pętli podwajaj wartość przez którą dzielisz kolejne bity.

0

Czyli załóżmy jeśli będzie chodzić o bit6 napiszemy char bit_6 = (n / (1 << 5)) % 2 + 48 itd?

0

Jeszcze chcesz cast do unsigned.

0

Muszę niestety robić dokładnie tak jak jest w instrukcji, nie mogę pisać żadnych pętli itd. Kropka w kropkę po prostu

0

Idiotyczne zadanie :​|

Ale w takim razie wpisz te potęgi z palca: 1,2,4,8,16,32,64,128

0
#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    char n;
    char bit_1;
    char bit_2;
    char bit_3;
    char bit_4;
    char bit_5;
    char bit_6;
    char bit_7;
    char bit_8;
    cin >> n;
    if(n >= -128 && n <= 127) {
        char bit_8 = (unsigned(n) % 2 + 48);
        char bit_7 = (unsigned(n) / (1 << 0)) % 2 + 48;
        char bit_6 = (unsigned(n) / (1 << 1)) % 2 + 48;
        char bit_5 = (unsigned(n) / (1 << 2)) % 2 + 48;
        char bit_4 = (unsigned(n) / (1 << 3)) % 2 + 48;
        char bit_3 = (unsigned(n) / (1 << 4)) % 2 + 48;
        char bit_2 = (unsigned(n) / (1 << 5)) % 2 + 48;
    }else if(n < 0) {
        bit_1 = '1';
    }else{
        bit_1 = '0';
    }
    cout << bit_1 << bit_2 << bit_3 << bit_4 << bit_5 << bit_6 << bit_7 << bit_8 << endl;



    return 0;
}

0

Masz odwrotnie potęgi (w oryginale masz od 1 do 6, czyli tu chcesz odpowiednio wartości od 0 do 5)
Couty oddziel << a nie plusami.

0

@kq: Z edytowałem post, działa tak jak powinno?

0

Nie, strzeliłem off by one (ale to też byś sam mógł zauważyć). 1..6 mają być przesunięcia, dzielenie przez jeden jest w pierwszym i jest po prostu ominięte.

0

Okej, wszystko działa, dziękuję bardzo za poświęcony czas i uwagi :)

0

Ach, jeszcze jedna uwaga: spłaszczyleś ify. Chcesz sprawdzić:

if (warunki brzegowe) {
    bit_8..2 = ...
    if (n < 0)
        bit_1 = ...
    else
        bit_1 = ...
}
// else error

1 użytkowników online, w tym zalogowanych: 0, gości: 1