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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
mogtar
0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 51
#1

Поменять байты - C++

06.12.2013, 17:47. Просмотров 1387. Ответов 11
Метки нет (Все метки)

Есть задача: дано число long int получить другое число путем перестановки двух ПОСЛЕДНИХ байтов с двумя ПЕРВЫМИ байтами.
C++ (Qt)
1
2
3
4
void ZadachaZashita(){
long int *i=new long int(2);
for(int s1=sizeof(i),s2=0;s2<2;s1--,s2++)
    swap(*(i+s1),*(i+s2));}
Отпишите пожалуйста правильно ли решил, новая тема, пока еще не полностью освоил.
Если не верно напишите пожалуйста как нужно сделать правильно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2013, 17:47     Поменять байты
Посмотрите здесь:

В числе 15 поменять местами младший и старший байты - C++
Здравствуйте всем объясните пожалуйста как например в числе 15 поменять местами младший и старший байты (Я Си изучаю только два дня) ...

Поменять местами левый и правый байты целого аргумента - C++
разработайте макрос swab(х) который меняет местами левый и правый байты целого аргумента х .Спасибо!

Упорядочить байты - C++
Помогите додумать. Нужны упорядочить байты в порядке возрастания количества еденичных битов в них(ввод в шестнадцетиричнйо системе). ...

Первые байты - C++
Задача вот в чем, надо получить 3 первых байта из файла. Подскажите как это сделать ?

Различные байты - C++
помогите, организовать цикл в котором перебираются все возможные варианты байт!! т.е составить массив где первым байтом будет 0x00 а...

Упаковка в байты - C++
Можно ли упаковать массив bitset допустим из 100 тысяч битов в байты, чтобы записать это дело в файл или можно записывать сразу в файл(но...

байты в строку - C++
как можно перевести 4 байта F1 08 25 12 а строку А1082512 ?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
457 / 306 / 24
Регистрация: 22.03.2011
Сообщений: 996
Завершенные тесты: 2
06.12.2013, 19:25     Поменять байты #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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
 
inline
int is_bit_set(long int value, int bit)
{
    return (value & ((long int)1 << bit)) != 0;
}
 
void print_binary(long int number)
{
    int size = sizeof(number) * 8 - 1;
    for (int i = size; i > 0; --i)
    {
        std::cout << is_bit_set(number, i) << " ";
    }
    std::cout << is_bit_set(number, 0) << std::endl;
}
 
inline
void swap_bit(long int& number, int set_bit, int unset_bit)
{
    number |= ((long int)1 << set_bit);
    number &= ~((long int)1 << unset_bit);
}
 
void swap(long int& number, int lhs_bit, int rhs_bit)
{
    int lhs_bit_set = is_bit_set(number, lhs_bit);
    int rhs_bit_set = is_bit_set(number, rhs_bit);
 
    if (lhs_bit_set == rhs_bit_set)
    {
        return;
    }
 
    if (lhs_bit_set && !rhs_bit_set)
    {
        swap_bit(number, rhs_bit, lhs_bit);
        return;
    }
 
    swap_bit(number, lhs_bit, rhs_bit);
}
 
int main()
{
    long int number = 0;
    std::cout << "Enter number" << std::endl;
    std::cin >> number;
 
    print_binary(number);
    
    swap(number, 0, sizeof(long int) * 8 - 2);
    swap(number, 1, sizeof(long int) * 8 - 1);
 
    print_binary(number);
 
    return 0;
}
МаксимТ
47 / 47 / 4
Регистрация: 17.08.2012
Сообщений: 225
06.12.2013, 19:45     Поменять байты #3
если речь действительно о байтах, то вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cstdio>
long int swap(long int data) {
    
    unsigned short tmp = *((unsigned short*) &data);
    *((unsigned short*) &data) = *((unsigned short*) ((void*)&data + sizeof (long int) - 2));
    *((unsigned short*) ((void*)&data + sizeof (long int) - 2)) = tmp;
    return data;
 
}
 
int main() {
 
    long int data=0x01020304;
    printf("sizeof of data is %d\n",sizeof(data));
    printf("In: %p out: %p\n",data,swap(data));
    
    return 0;
}
stima
457 / 306 / 24
Регистрация: 22.03.2011
Сообщений: 996
Завершенные тесты: 2
06.12.2013, 20:34     Поменять байты #4
МаксимТ, только unsigned short это никак не 2 байта.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
06.12.2013, 20:39     Поменять байты #5
Цитата Сообщение от mogtar Посмотреть сообщение
long int
бывает и 32 бита и 64
и потом как переставлять
вот направление байт в 64 битном
1 2 3 4 5 6 7 8
как должно получится
7 8 3 4 5 6 1 2
или
8 7 3 4 5 6 2 1

Добавлено через 21 секунду
Цитата Сообщение от stima Посмотреть сообщение
МаксимТ, только unsigned short это никак не 2 байта.
а сколько?
stima
457 / 306 / 24
Регистрация: 22.03.2011
Сообщений: 996
Завершенные тесты: 2
06.12.2013, 20:41     Поменять байты #6
Упс, я прошляпил, мне показалось 2 последних бита. Мои извинения.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
06.12.2013, 20:52     Поменять байты #7
для 1234= 3412
и 12345678=78345612
общее решение
C++
1
2
3
4
5
6
7
int sz=8*sizeof(long);
int szOffset=sz-16;
unsigned long maskLo=0xFFFF;
unsigned long maskHi=maskLo<<szOffset;
unsigned long maskM=~(maskLo|maskHi);
 
unsigned long res= (n&maskM) |(( n>>szOffset)&maskLo) |((n<<szOffset)&maskHi);
МаксимТ
47 / 47 / 4
Регистрация: 17.08.2012
Сообщений: 225
06.12.2013, 21:04     Поменять байты #8
Цитата Сообщение от stima Посмотреть сообщение
МаксимТ, только unsigned short это никак не 2 байта.
ну значит вместо этого типа нужно использовать двухбайтный тип, у меня 2
mogtar
0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 51
06.12.2013, 21:11  [ТС]     Поменять байты #9
Цитата Сообщение от МаксимТ Посмотреть сообщение
ну значит вместо этого типа нужно использовать двухбайтный тип, у меня 2
А моя функция вообще не имеет право на существование? просто то что вы пишете будет слишком сложно для нашей 1 темы по указателям, мне мягко говоря не поверят
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
06.12.2013, 21:15     Поменять байты #10
Цитата Сообщение от mogtar Посмотреть сообщение
А моя функция вообще не имеет право на существование?
в таком виде нет
Цитата Сообщение от mogtar Посмотреть сообщение
int s1=sizeof(i)
это размер указателя на число
а не размер числа
Цитата Сообщение от mogtar Посмотреть сообщение
swap(*(i+s1),*(i+s2))
что это за функция?
mogtar
0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 51
06.12.2013, 21:23  [ТС]     Поменять байты #11
Цитата Сообщение от ValeryS Посмотреть сообщение
в таком виде нет

это размер указателя на число
а не размер числа


что это за функция?
Встроенная в QT меняет буквально все что угодно. Не нужно обьявлять для 3 переменную для замены.

Добавлено через 4 минуты
Сдвиг мы проходили только для массивов, только написали модуль по массивам, начали изучать указатели. свап вроде как встроен в QT меняет элементы местами.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2013, 21:27     Поменять байты
Еще ссылки по теме:

Конвертация из бит в байты - C++
есть битовый массив bitset, заполненый определённым образом. есть char* bytes далее мне понадобилось из массива битов сделать массив...

перевессти байты в слово - C++
привет)))есть массив байтов(шестнадцатеричный) 53 48 4f 52 54 и т.д., есть признак того, что этому массиву соответсвует либо int, либо...

Достать байты из переменной - C++
есть некий класс\структура. Например: class CLScls { private: int a, b, c; char d; string str; ...

Байты бинарных данных - C++
Могут ли в числе байт изображения быть отрицательные байты со значение -1, -100 и так далее? Или бинарные данные могу содержать только...

Заменить определенный байты изображения - C++
Здравствуйте, я хочу заменить определенный байты изображения, вроде бы по коду у меня все нормально, но похоже я что-то напутал с флагами...


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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
06.12.2013, 21:27     Поменять байты #12
Цитата Сообщение от mogtar Посмотреть сообщение
просто то что вы пишете будет слишком сложно для нашей 1 темы
сложно потому что я не зная размер и высчитываю его
и создаю маски
если точно 32 бита то вообще все просто
C++
1
result=n<<16 | (n>>16)&0xFFFF
без сдвигов
C++
1
result=n*65536 +(n/65536) &0xFFFF
если n беззнаковое (unsigned)
то еще упрощается, не надо отсекать старшие биты
C++
1
result=n<<16 | n>>16;
C++
1
result=n*65536 +n/65536;
Добавлено через 3 минуты
Цитата Сообщение от mogtar Посмотреть сообщение
Встроенная в QT меняет буквально все что угодно.
QT это не совсем С++
да он сделан на его основе но добавлена куча вещей которые в классическом языке не пойдут
да и swap что меняет char short int?
ты у себя в вызове не указал размерность аргументов, что она менять будет?
Yandex
Объявления
06.12.2013, 21:27     Поменять байты
Ответ Создать тему
Опции темы

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