Форум программистов, компьютерный форум CyberForum.ru

Преобразовать целые числа в битовую посследовательность - C++

Восстановить пароль Регистрация
 
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 118
30.01.2013, 20:28     Преобразовать целые числа в битовую посследовательность #1
Имеется в файле посследовательность целых чисел X1,X2,X3,X4 unsigned long int, расположенных построчно. Нужно преобразовать эти целые числа в битовую посследовательность x1 1, x1 2, x1 3, x1 4, x1 5, ..., x1 31, x1 32, x2 1, x2 2, x2 3, x2 4, x2 5, ..., x2 31, x2 32, x3 1, ... (где x1 1 – младший бит первого числа, x2 32 – старший (32-й) бит второго числа).
Не понимаю как это осуществить Перевести сначала числа в 2-ую систему счисления, а потом как?

Добавлено через 1 час 46 минут
help хотя-бы подскажите в каком направлении двигаться
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2013, 20:28     Преобразовать целые числа в битовую посследовательность
Посмотрите здесь:

Даны два целых числа M но N. Вывести все целые числа из промежутка [M,n] C++
C++ Дана строка, содержащая целые числа. Вывести на экран только чётные числа
C++ Задана строка, содержащая целые числа (максимум 15 чисел). Упорядочить целые числа в строке по убыванию.
C++ Дано два числа А и В (А<В). Вывести в порядке увеличения все целые числа
C++ Преобразовать строки в целые числа, просуммировать и вывести сумму 4 значений
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
30.01.2013, 20:52     Преобразовать целые числа в битовую посследовательность #2
Как вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <bitset>
 
template<size_t s>
std::bitset<s> & reversebits(std::bitset<s> & bs){
    bool temp;
    for(size_t i=0,size=bs.size();i<size/2;++i){
        temp=bs[i];
        bs[i]=bs[size-i-1];
        bs[size-i-1]=temp;
    }
    return bs;
}
 
 
int main(){
    std::vector<unsigned long int> vec;
    vec.push_back(255);
    vec.push_back(65525);
    vec.push_back(3243246);
    std::bitset<sizeof(unsigned long int)*8> outbit;
    
    for(int i=0;i<vec.size();++i){
        outbit=vec[i]; 
        std::cout<<std::fixed<<reversebits(outbit);
    }
    std::cout<<std::endl;
}
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 118
30.01.2013, 21:20  [ТС]     Преобразовать целые числа в битовую посследовательность #3
Цитата Сообщение от Croessmah Посмотреть сообщение
Как вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <bitset>
 
template<size_t s>
std::bitset<s> & reversebits(std::bitset<s> & bs){
    bool temp;
    for(size_t i=0,size=bs.size();i<size/2;++i){
        temp=bs[i];
        bs[i]=bs[size-i-1];
        bs[size-i-1]=temp;
    }
    return bs;
}
 
 
int main(){
    std::vector<unsigned long int> vec;
    vec.push_back(255);
    vec.push_back(65525);
    vec.push_back(3243246);
    std::bitset<sizeof(unsigned long int)*8> outbit;
    
    for(int i=0;i<vec.size();++i){
        outbit=vec[i]; 
        std::cout<<std::fixed<<reversebits(outbit);
    }
    std::cout<<std::endl;
}
А можете обьяснить посследовательно как он работает? Не очень понятно
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
30.01.2013, 22:08     Преобразовать целые числа в битовую посследовательность #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <bitset>
 
//Функция переворачивает переданный bitset и возвращает ссылку не него же
template<size_t s>
std::bitset<s> & reversebits(std::bitset<s> & bs){
    bool temp;
    for(size_t i=0,size=bs.size();i<size/2;++i){//Проходим по первой половине массива
         //Меняем местами элементы (первый с последним, второй с предпоследним и .т.д)
        temp=bs[i];
        bs[i]=bs[size-i-1];
        bs[size-i-1]=temp;
    }
    return bs;
}
 
 
int main(){
    std::vector<unsigned long int> vec;
    vec.push_back(255);//Записываем в вектор три числа
    vec.push_back(65525);
    vec.push_back(3243246);
    std::bitset<sizeof(unsigned long int)*8> outbit;//битовый массив из STL
    
    for(int i=0;i<vec.size();++i){//Проходим по всем элементав вектора
        outbit=vec[i]; //Пихаем текущее значение в векторе в bitset
        std::cout<<std::fixed<<reversebits(outbit);//Переворачиваем элементы в Bitset и выводим содержимое в поток cout
    }
    std::cout<<std::endl;
}
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 118
30.01.2013, 23:55  [ТС]     Преобразовать целые числа в битовую посследовательность #5
К сожалению с изучаю только год и не владею такими сложными вещами поэтому и непонятно

Добавлено через 22 минуты
А нельзя как-нибудь попроще представить это код? чтоли ближе к сишному?

Добавлено через 59 минут
Если бы можно было представить это без векторов,,потоков, а через циклы и функции я бы всё поняла
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
31.01.2013, 02:27     Преобразовать целые числа в битовую посследовательность #6
Цитата Сообщение от melanu Посмотреть сообщение
чтоли ближе к сишному?
Так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <cstdio>
 
void showbinary(unsigned long int x){
    size_t size=sizeof(x)*8;
    for(size_t i=0;i<size;++i,x/=2)
        printf("%d",x%2);
}
 
int main(){
    showbinary(255);
    showbinary(32423);
    showbinary(38297498);
    printf("\nPress enter");
    getchar();
}
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
31.01.2013, 04:19     Преобразовать целые числа в битовую посследовательность #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
const int n=10;
long int a[n]={4,2,1,32,128,4,4,4,4,4};
long int b[n]={0,0,0,0,0,0,0,0,0,0};
int main() {
    int i, k, m;
    unsigned __int64 buff,temp;
    unsigned int bt;
    buff=0;
    k=0;
    for(i=0; i<n; i++) {
        if(buff & 0xFFFFFFFF80000000) {
            b[k++] = buff & 0xFFFFFFFF;
            buff >>= 32;
        }
        for(m=32, bt = 0x80000000; m > 0 && (bt & buff) == 0; m--, bt >>= 1);
        temp = a[i];
        temp <<= m;
        buff |= temp;
    }
    b[k++] = buff & 0xFFFFFFFF;
    buff >>= 32;
    if(buff) b[k++] = buff;
    for(i=0; i<k; i++) printf("%08X\n", b[i]);
    return 0;
}
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 118
31.01.2013, 12:04  [ТС]     Преобразовать целые числа в битовую посследовательность #8
Цитата Сообщение от Croessmah Посмотреть сообщение
Так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <cstdio>
 
void showbinary(unsigned long int x){
    size_t size=sizeof(x)*8;
    for(size_t i=0;i<size;++i,x/=2)
        printf("%d",x%2);
}
 
int main(){
    showbinary(255);
    showbinary(32423);
    showbinary(38297498);
    printf("\nPress enter");
    getchar();
}
Да спасибо огромное теперь более понятным языком написано Получается вот эти вот числа: 255 32423 38297498 она переводит в битовую посследовательность? я правильно понимаю?

Добавлено через 20 минут
Цитата Сообщение от palva Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
const int n=10;
long int a[n]={4,2,1,32,128,4,4,4,4,4};
long int b[n]={0,0,0,0,0,0,0,0,0,0};
int main() {
    int i, k, m;
    unsigned __int64 buff,temp;
    unsigned int bt;
    buff=0;
    k=0;
    for(i=0; i<n; i++) {
        if(buff & 0xFFFFFFFF80000000) {
            b[k++] = buff & 0xFFFFFFFF;
            buff >>= 32;
        }
        for(m=32, bt = 0x80000000; m > 0 && (bt & buff) == 0; m--, bt >>= 1);
        temp = a[i];
        temp <<= m;
        buff |= temp;
    }
    b[k++] = buff & 0xFFFFFFFF;
    buff >>= 32;
    if(buff) b[k++] = buff;
    for(i=0; i<k; i++) printf("%08X\n", b[i]);
    return 0;
}
Пробовала этот код но выдаёт много warning
3\main.c(43): error #2001: Syntax error: expected ';' but found 'buff'.
3\main.c(43): error #2048: Undeclared identifier 'buff'.
3\main.c(43): error #2048: Undeclared identifier 'temp'.
3\main.c(50): warning #2131: Shifting an 'int' by 32 bits is undefined.
3\main.c(58): warning #2131: Shifting an 'int' by 32 bits is undefined.
3\main.c(43): warning #2114: Local '__int64' is not referenced.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
31.01.2013, 12:09     Преобразовать целые числа в битовую посследовательность #9
Цитата Сообщение от melanu Посмотреть сообщение
выдаёт много warning
Это не warning, это ошибки. В вашем компиляторе имя типа int64 не такое как в Visual Studio. Попробуйте убрать одно подчеркивание, или читайте документацию к вашему компилятору.
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 118
31.01.2013, 12:13  [ТС]     Преобразовать целые числа в битовую посследовательность #10
Цитата Сообщение от palva Посмотреть сообщение
Это не warning, это ошибки. В вашем компиляторе имя типа int64 не такое как в Visual Studio. Попробуйте убрать одно подчеркивание, или читайте документацию к вашему компилятору.
Минутку, попробую!
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
31.01.2013, 12:27     Преобразовать целые числа в битовую посследовательность #11
warning должен быть один в 24 строке. Возможная потеря точности. Его можно избежать, если написать так:
C++
1
    if(buff) b[k++] = (long) buff;
Но можно и не обращать внимания на этот warning.

Добавлено через 12 минут
Еще заметил ошибку свежим взглядом. `long' надо всюду заменить на `unsigned long'. Эта ошибка может проявляться при больших исходных числах.
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 118
31.01.2013, 12:28  [ТС]     Преобразовать целые числа в битовую посследовательность #12
Да вроде нормально, только я непонимаю что это за числа и откуда они взялись 0xFFFFFFFF80000000 0xFFFFFFFF 0x80000000 и buff - это временное хранилище?
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
31.01.2013, 12:32     Преобразовать целые числа в битовую посследовательность #13
Это маски для выделения битов. buf временное хранилище. Туда добавляются предварительно сдвинутые на нужное число битов исходные числа. По мере заполнения младшие 32 бита уходят в результирующий массив b, а хранилище сдвигается вправо, выталкивая эти биты и освобождая место для новых поступлений массива a.
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 118
31.01.2013, 12:36  [ТС]     Преобразовать целые числа в битовую посследовательность #14
Я что-то про маски сразу и подумала А если мне нужно считывать из файла а не из массива а[n]? И откуда мы знаем на сколько нужно сдвигать биты?
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
31.01.2013, 12:44     Преобразовать целые числа в битовую посследовательность #15
Цитата Сообщение от melanu Посмотреть сообщение
А если мне нужно считывать из файла а не из массива
Тогда нужно массив предварительно ввести. При этом будет определен размер n.
Цитата Сообщение от melanu Посмотреть сообщение
И откуда мы знаем на сколько нужно сдвигать биты?
Это делает длинный цикл for. Он, двигаясь вправо, ищет первый ненулевой бит в хранилище. Этот бит будет старшим битом предыдущего числа a. Следующее число должно сдвинуться на m, чтобы его младший бит следовал за старшим битом предыдущего числа.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2013, 12:46     Преобразовать целые числа в битовую посследовательность
Еще ссылки по теме:

В одномерном массиве, элементы которого -целые числа, удалить все четные числа C++
Даны целые массивы А[5], В[5] и значения R и F. Каждый массив преобразовать по правилу: C++
В одномерном массиве, элементы которого - целые числа, удалить все четные числа C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 118
31.01.2013, 12:46  [ТС]     Преобразовать целые числа в битовую посследовательность #16
аааа всё теперь ясно! спасибки!
Yandex
Объявления
31.01.2013, 12:46     Преобразовать целые числа в битовую посследовательность
Ответ Создать тему
Опции темы

Текущее время: 08:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru