Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
1

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

30.01.2013, 20:28. Показов 5201. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется в файле посследовательность целых чисел 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 хотя-бы подскажите в каком направлении двигаться
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2013, 20:28
Ответы с готовыми решениями:

Преобразовать строки в целые числа, просуммировать и вывести сумму 4 значений
Напишите программу, которая вводит 4 строки, представляющие целые значения, преобразует строки в...

Задана строка, содержащая целые числа (максимум 15 чисел). Упорядочить целые числа в строке по убыванию.
Задана строка, содержащая целые числа (максимум 15 чисел). Упорядочить целые числа в строке по...

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

Даны целые числа р и q. Получить все делители числа q, взаимно простые с р
Получить все делители числа q, взаимно простые с р.

15
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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;
}
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
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;
}
А можете обьяснить посследовательно как он работает? Не очень понятно
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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;
}
1
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
30.01.2013, 23:55  [ТС] 5
К сожалению с изучаю только год и не владею такими сложными вещами поэтому и непонятно

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

Добавлено через 59 минут
Если бы можно было представить это без векторов,,потоков, а через циклы и функции я бы всё поняла
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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();
}
1
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 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;
}
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
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.
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
31.01.2013, 12:09 9
Цитата Сообщение от melanu Посмотреть сообщение
выдаёт много warning
Это не warning, это ошибки. В вашем компиляторе имя типа int64 не такое как в Visual Studio. Попробуйте убрать одно подчеркивание, или читайте документацию к вашему компилятору.
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
31.01.2013, 12:13  [ТС] 10
Цитата Сообщение от palva Посмотреть сообщение
Это не warning, это ошибки. В вашем компиляторе имя типа int64 не такое как в Visual Studio. Попробуйте убрать одно подчеркивание, или читайте документацию к вашему компилятору.
Минутку, попробую!
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
31.01.2013, 12:27 11
warning должен быть один в 24 строке. Возможная потеря точности. Его можно избежать, если написать так:
C++
1
    if(buff) b[k++] = (long) buff;
Но можно и не обращать внимания на этот warning.

Добавлено через 12 минут
Еще заметил ошибку свежим взглядом. `long' надо всюду заменить на `unsigned long'. Эта ошибка может проявляться при больших исходных числах.
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
31.01.2013, 12:28  [ТС] 12
Да вроде нормально, только я непонимаю что это за числа и откуда они взялись 0xFFFFFFFF80000000 0xFFFFFFFF 0x80000000 и buff - это временное хранилище?
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
31.01.2013, 12:32 13
Это маски для выделения битов. buf временное хранилище. Туда добавляются предварительно сдвинутые на нужное число битов исходные числа. По мере заполнения младшие 32 бита уходят в результирующий массив b, а хранилище сдвигается вправо, выталкивая эти биты и освобождая место для новых поступлений массива a.
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
31.01.2013, 12:36  [ТС] 14
Я что-то про маски сразу и подумала А если мне нужно считывать из файла а не из массива а[n]? И откуда мы знаем на сколько нужно сдвигать биты?
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
31.01.2013, 12:44 15
Цитата Сообщение от melanu Посмотреть сообщение
А если мне нужно считывать из файла а не из массива
Тогда нужно массив предварительно ввести. При этом будет определен размер n.
Цитата Сообщение от melanu Посмотреть сообщение
И откуда мы знаем на сколько нужно сдвигать биты?
Это делает длинный цикл for. Он, двигаясь вправо, ищет первый ненулевой бит в хранилище. Этот бит будет старшим битом предыдущего числа a. Следующее число должно сдвинуться на m, чтобы его младший бит следовал за старшим битом предыдущего числа.
1
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
31.01.2013, 12:46  [ТС] 16
аааа всё теперь ясно! спасибки!
0
31.01.2013, 12:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2013, 12:46
Помогаю со студенческими работами здесь

Дано два числа А и В (А<В). Вывести в порядке увеличения все целые числа
Дано два числа А и В (А&lt;В). Вывести в порядке увеличения все целые числа, расположеные между А и...

Даны целые числа, удалить все числа со значением максимального из них
Даны целы числа х1,...,xn . удалить все числа со значением max(х1,...,xn) Не могу найти ошибку......

Даны целые числа р и q. Получить все делители числа q, взаимно простые с р.
Даны целые числа р и q. Получить все делители числа q, взаимно простые с р. Решите на С++. Заранее...

Даны два целых числа M но N. Вывести все целые числа из промежутка [M,n]
Даны два целых числа M но N. Вывести все целые числа из промежутка , которые делящиеся 2, но не...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru