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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
mogtar
0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 51
06.12.2013, 17:47     Поменять байты #1
Есть задача: дано число 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));}
Отпишите пожалуйста правильно ли решил, новая тема, пока еще не полностью освоил.
Если не верно напишите пожалуйста как нужно сделать правильно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
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
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
06.12.2013, 20:34     Поменять байты #4
МаксимТ, только unsigned short это никак не 2 байта.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
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
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
06.12.2013, 20:41     Поменять байты #6
Упс, я прошляпил, мне показалось 2 последних бита. Мои извинения.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
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
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
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++
C++ Упаковка в байты
Упорядочить байты C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
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     Поменять байты
Ответ Создать тему
Опции темы

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