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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
#1

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

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

Имеется в файле посследовательность целых чисел 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2013, 20:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразовать целые числа в битовую посследовательность (C++):

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

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

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

Даны целые числа, удалить все числа со значением максимального из них - C++
Даны целы числа х1,...,xn . удалить все числа со значением max(х1,...,xn) Не могу найти ошибку... #include<iostream> using...

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

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

15
Croessmah
Эксперт CЭксперт С++
13510 / 7668 / 866
Регистрация: 27.09.2012
Сообщений: 18,866
Записей в блоге: 3
Завершенные тесты: 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
melanu
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
Croessmah
Эксперт CЭксперт С++
13510 / 7668 / 866
Регистрация: 27.09.2012
Сообщений: 18,866
Записей в блоге: 3
Завершенные тесты: 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
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
30.01.2013, 23:55  [ТС] #5
К сожалению с изучаю только год и не владею такими сложными вещами поэтому и непонятно

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

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

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

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

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

В одномерном массиве, элементы которого - целые числа, удалить все четные числа - C++
В одномерном массиве, элементы которого - целые числа, удалить все четные числа именно удалить а не оставить все не четные удалить...

Дана строка, содержащая целые числа. Вывести на экран только чётные числа - C++
я накидала код...но что-то тут не ладное((( #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;cstdlib&gt; #include &lt;stdio.h&gt; using...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru