битовые операции - Вывод битового кода числа


8

Как сделать, чтобы после ввода числа, программа вывела его битовый код? Прочитал про битовые операции, но все же реализовать саму программу не смог

Источник
  •  3315
  •  5
  • 29 янв 2014 2014-01-29 00:04:31
не хотите помогать, могли бы и не отвечать! — 9 янв 20122012-01-09 16:16:29.000000
это элементарная простейшая вещь — 9 янв 20122012-01-09 16:09:28.000000
не думаю что битовый код - элементарная вещь. Да и с тех пор как я начал задавать вопросы, я развиваю себя. Читаю и практикуюсь. Хоть и мелкими шагами, но все же двигаюсь. И часто я учусь и понимаю на примерах. Вот почему и просил от вас — 9 янв 20122012-01-09 16:01:57.000000
И не должно быть. Там описаны необходимые кирпичики для построения программы. Вы уже давно тут задаете вопросы по С++, а элементарных вещей не научились делать. — 9 янв 20122012-01-09 15:57:18.000000
Почитайте о битовых операциях. — 9 янв 20122012-01-09 14:49:12.000000

5 ответов

0

Была как то задача, в которой необходимо было заполнить массив от 0 до а битами каждого числа.

 #include <iostream>
    using namespace std;

    int main()
    {
        int a;
        cin >> a;
        int row = 1 << a, row1;
        int digit[row][a];
        for(int i = 0; i < row; i++){
        row1 = i;
            for(int j = 0; j < a; j++){
                digit[i][j] = (row1 >> (a - j - 1)) & 1;
            }
        }
        for(int i = 0; i < row; i++){
            for(int j = 0; j < a; j++){
                cout << digit[i][j] << " ";
            }
            cout << endl;
        }
        return 0;
    }
  • 11 янв 2017 2017-01-11 10:42:48
5

Странно, что std::bitset никто не вспомнил:

#include <iostream>
#include <bitset>
#include <climits>

int main() {
    int num = 32;
    std::cout << std::bitset<sizeof(num) * CHAR_BIT>(num) << "n";
}

00000000000000000000000000100000

1

http://ideone.com/IHMlWD

#include <cstdio>

template <typename number> char * tobinary(number x, char *buf)
{
    number q;
    char *p=buf;

    if((number)~0<0)
    {
        *(p++) = 0 + (x<0);
        q = (number)1 << ((sizeof(number)<<3) - 2);
    }
    else
        q = (number)1 << ((sizeof(number)<<3) - 1);

    for(; q; q>>=1)
        *(p++) = x & q ? 1 : 0;

    *p = 0;

    return buf;
}

#define POSVAL 7
#define NEGVAL -7

int main(void)
{
    char temp[128];

    #define TEST(type,val) do { type x=val; puts(tobinary(x, temp)); } while(0)

    TEST(char, POSVAL);
    TEST(unsigned char, POSVAL);
    TEST(signed char, POSVAL);

    TEST(unsigned short, POSVAL);
    TEST(signed short, POSVAL);

    TEST(unsigned, POSVAL);
    TEST(signed, POSVAL);

    TEST(unsigned long, POSVAL);
    TEST(signed long, POSVAL);

    TEST(unsigned long long, POSVAL);
    TEST(signed long long, POSVAL);

    TEST(char, NEGVAL);
    TEST(unsigned char, NEGVAL);
    TEST(signed char, NEGVAL);

    TEST(unsigned short, NEGVAL);
    TEST(signed short, NEGVAL);

    TEST(unsigned, NEGVAL);
    TEST(signed, NEGVAL);

    TEST(unsigned long, NEGVAL);
    TEST(signed long, NEGVAL);

    TEST(unsigned long long, NEGVAL);
    TEST(signed long long, NEGVAL);

    #undef TEST

    getchar();

    return 0;
}
  • 13 янв 2016 2016-01-13 15:37:59
А ещё есть en.cppreference.com/w/cpp/types/make_unsigned 13 янв 20162016-01-13 15:50:18.000000
Хм, а почему sizeof(number)<<3, а не sizeof(number) * CHAR_BIT? А вдруг байт не восьмибитный? — 13 янв 20162016-01-13 15:49:04.000000
2
typedef unsigned short ushort;
ushort num = 34;
for(int i = 15; i >= 0; --i) // short 16 бит (00000000 00000000)
   std::cout << ((num >> i) & 1) << " "; // проходимся по битам и выводим через пробел

Для этого необходимо выучить побитовые операции, это совсем несложно - информации в интернете полным полно

  • 13 янв 2016 2016-01-13 15:25:31
@VladD, cyberforum.ru/cpp-beginners/thread1347020.html 13 янв 20162016-01-13 15:42:04.000000
Почему 15, а не (sizeof(num) * CHAR_BIT) - 1? — 13 янв 20162016-01-13 15:29:00.000000
6
int i, N;
N = 1234;
i = 65536;

while (true) {
    if (N & i)        // битовое И - в данном случае вернет 2^i - если i-ый бит 1
        printf("1");
    else
        printf("0"); 
    if (i == 1)       // мы рассмотрели младший бит - выходим из цикла
        break;
    i >>= 1;         // битовый сдвиг, запись числа смещается на один бит
}                    // аналогично делению на 2, но быстрее.

Как вариант.

Вариаций много, изучите битовые операции: wiki.

65536= двоичное 10000000000000000, т.е. это 16-й бит если считать от 0 N&i делает побитовую операцию "И", получется если в N этот бит установлен - результат не 0, иначе 0. Далее идёт сдвиг и в следующий раз анализируем 15-й бит и т.д. — 9 янв 20122012-01-09 08:11:55.000000
ты можешь мне написать программу, которая будет выводить битовый код числа? Я так а то не понимаю. Я знаю у тебя всегда бывает очень понятный код, с комментариями особенно. Если не трудно, можешь показать? А то я читаю читаю и не вникаю никак. Может так пойму — 9 янв 20122012-01-09 15:58:03.000000
> объясните мне строку: if(N&i) По приведенной ссылке на википедию смотрите таблицу в разделе "в языках программирования". — 9 янв 20122012-01-09 15:53:16.000000
а что тут N и i означают??? И если не трудно, объясни мне строку: if(N&i) printf("1"); — 9 янв 20122012-01-09 15:06:43.000000