1

Тема: Вивести двійкове число.

// Функция выводит на экран двоичное представление числа A.
#include <iostream>
using namespace std;
void Binary(unsigned);
void main()
{
   struct Bits
   { 
     unsigned bit1: 3;
     unsigned bit2: 2;
     unsigned bit3: 3;
   } Good;
   
   Good.bit1 = 4;
   Good.bit2 = 3;
   Good.bit3 = 6;
   cout<<"Show: "<<Good.bit1<<" ";
   cout<<Good.bit2<<" ";
   cout<<Good.bit3<<"\n\n";
   cout << "Sum: ";
   Binary(Good.bit1 + Good.bit2 + Good.bit3);
} 
// Функция выводит на экран двоичное представление числа A.
void Binary (unsigned A) 
{
    int i,N;
    if(A>255)
        N = 15;
    else
        N = 7;
    for (i=N; i >= 0; i--)
    { 
    cout<<((A>>i)&1);
            if(i==8)
        cout<<" ";
    }
    cout<<"\n\n";
}

Хто-небудь може пояснити оцю строку?    
cout<<((A>>i)&1);
Дуже хочеться зрозуміти її...

2

Re: Вивести двійкове число.

Також цікаво було б глянути на інші алгоритми виводу якщо вони є :}

3

Re: Вивести двійкове число.

& - це здається бітове множення
cout << Вивести щось на консоль
A>>i бітовий зсув праворуч на і
Зараз ще спробую щось намалювати.

Подякували: koala1

4 Востаннє редагувалося Joker (07.05.2015 21:05:48)

Re: Вивести двійкове число.

не впевнений, що другий приклад правильний.

https://cloclo3.cloud.mail.ru/weblink/thumb/xw1/EpdrrHWX8B8L/%D0%B7%D1%81%D1%83%D0%B2.JPG?x-email=havdyak_misha1998%40mail.ru

Прихований текст

https://cloclo3.cloud.mail.ru/weblink/thumb/xw1/4EHovHyHn1vk/%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D1%8F.JPG?x-email=havdyak_misha1998%40mail.ru

5

Re: Вивести двійкове число.

Правильно сумніваєтесь. Там нулі.

Подякували: koala, Joker2

6

Re: Вивести двійкове число.

Куди ж піде 1?

7

Re: Вивести двійкове число.

У жо.. чорну дірку флаг переповнення.
Втім, це залежить від процесора і компілятора; якщо не помиляюся, то зсув одинички надо високо - це UB.

8

Re: Вивести двійкове число.

і залишуться тільки одні нулі?

9

Re: Вивести двійкове число.

Цитую стандарт:

The value of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are zero-filled. If E1 has an unsigned type, the value of the result is E1 × 2^E2, reduced modulo one more than the maximum value representable in the result type. Otherwise, if E1 has a signed type and non-negative value, and E1 × 2^E2 is representable in the corresponding unsigned type of the result type, then that value, converted to the result type, is the resulting value; otherwise, the behavior is undefined.

http://www.open-std.org/jtc1/sc22/wg21/ … /n3797.pdf

Мій переклад:

Значення E1 << E2 є E1, зсунуте ліворуч на E2 бітових позицій; звільнені біти заповнюються нулями. Якщо E1 має беззнаковий тип, результатом є E1 × 2^E2, взяте за модулем на один більшим, ніж максимальне значення, що можна представити типом результата (мова йде про залишок від ділення). Якщо ж E1 має знаковий тип і невід'ємне значення, і E1 × 2^E2 можна представити відповідним типом результата, тоді це і є значення результата; в інших випадках поведінка невизначена.

Оскільки тут змінні беззнакові, то - так, залишаться тільки нулі. А от якби були знакові, то одиничка нагорі робила б що завгодно.

Подякували: Joker1