Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 64, средняя оценка - 4.64
Leshiy1
0 / 0 / 7
Регистрация: 03.04.2010
Сообщений: 153
#1

В числе 15 поменять местами младший и старший байты - C++

07.04.2010, 16:33. Просмотров 9586. Ответов 23
Метки нет (Все метки)

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

Добавлено через 8 минут
Переменная типа int
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2010, 16:33
Я подобрал для вас темы с готовыми решениями и ответами на вопрос В числе 15 поменять местами младший и старший байты (C++):

Поменять местами старший и младший полубайты
Как поменять старший и младший полубайт беззнакового короткого целого местами?...

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

Поменять местами байты
Есть два байта 0x1f и 0xf0 - ну или другие два случайные. Они стоят в...

Поменять местами средние байты заданного числа
Здравствуйте, нужна помощь с данным заданием Заранее благодарю) "Программе...

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

Поменять цифры в числе местами
салам!) помогите решить одну задачу, нужно вывести число цифрами наоборот....

23
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
07.04.2010, 16:39 #2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
typedef union {
    int ival;
    char cval[sizeof(int)];
} Un_t;
 
int main(void){
    Un_t un;
    char tmp;
 
    printf("Value: ");
    scanf("%d", &un.ival);
    tmp = un.cval[0];
    un.cval[0] = un.cval[sizeof(int) - 1];
    un.cval[sizeof(int) - 1] = tmp;
    printf("Result: %d\n", un.ival);
 
    return 0;
}
3
Leshiy1
0 / 0 / 7
Регистрация: 03.04.2010
Сообщений: 153
07.04.2010, 16:41  [ТС] #3
Спасибо большое за код
0
kirich iz Che
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 25
03.07.2010, 13:20 #4
на c++ можете написать плиз?
0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
03.07.2010, 15:14 #5
Вот, правда сугубо С++'ного здесь ничего нет (кроме cout), делает то же самое,только совершенно другим способом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>    
using namespace std;
int main (){
    int val=0x12345678;
    int n=(sizeof(int)-1)*8;
    int t=0xFF00;
    for(int i=n;i/=8;i--)
        t=(t<<8)|t;
val = (t&val)|(val<<n)|(val>>n);
cout<<"Result = "<<(hex)<<val<<endl;
system("pause");
  return 0;    
}
шестнадцатиричное представление числа использовал для наглядности, выводит 78345612.
2
kirich iz Che
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 25
03.07.2010, 19:56 #6
поясни плиз что происходит, а способ как раз то что нужно, через смещения)
0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
04.07.2010, 07:14 #7
Код получился не универсальный, как хотелось бы.(если int будет 2 байта, то результат будет не правильный) Я это заметил уже после того как код выложил, пробовал переписать, но получился быдлокод) Но при int==4 байта(чаще всего так и есть) - все правильно.
Главная часть кода основывается на смещении и логических опреациях "И" и "ИЛИ", попробую объяснить "на пальцах" Сначало высчитываем n (размер (int-1)*8 - в битах), оно нужно для сдвигов влево и вправо таким образом, чтоб крайний слева(справа) байт стал крайним справа(слева). Далее есть число (hex) 12345678, двигаем влево, получается 78000000, двигаем вправо, получается 00000012. Делаем "ИЛИ" этих двух чисел, получается 78000012, таким образом мы поменяли местами крайний левый и крайний правый байты, нужно заполнить середину. Для этого нужно подготовить маску для операции "И", для этого используем цикл (вот он то как раз не универсален, т.к. если int будет равен 2 байта, то маска получится FF00, что не есть правильно), при int = 4 байта получаем маску 00FFFF00 ( в двоичном виде 000000001111111111111111111111111111111100000000)), делаем VAL & маска, получается 00345600, т.е. середина нашего числа, а крайние байты = 0. Ну и последние это 78000012 "ИЛИ" 00345600, получается 78345612. Вот собственно и все)
1
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.07.2010, 09:04 #8
Kastaneda, я не понял зачем цикл
C
1
2
unsigned int dword = 0x11223344;
dword = (dword << 24) | (dword & 0x00FFFF00) | (dword >> 24);
кстати, для битовых операций, лучше пользоваться беззнаковыми представлениями чисел, иначе результат может быть непредсказуемым.
1
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
04.07.2010, 09:27 #9
Цитата Сообщение от fasked Посмотреть сообщение
Kastaneda, я не понял зачем цикл
C
1
2
unsigned int dword = 0x11223344;
dword = (dword << 24) | (dword & 0x00FFFF00) | (dword >> 24);
кстати, для битовых операций, лучше пользоваться беззнаковыми представлениями чисел, иначе результат может быть непредсказуемым.
Ну да, можно и так, а цикл - это попытка (как я уже писал - неудачная) сделать код универсальным, на случай если int = 2 байта. А по поводу знаковое\беззнаковое, то в данном случае по-моему нет ни какой разницы. Задача же в том, чтобы поменять местами первый и последний байты, и не зависимо от старшего бита (т.е. знака) этот код будет делать свое дело)
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.07.2010, 14:50 #10
Цитата Сообщение от Kastaneda Посмотреть сообщение
Ну да, можно и так, а цикл - это попытка (как я уже писал - неудачная) сделать код универсальным, на случай если int = 2 байта. А по поводу знаковое\беззнаковое, то в данном случае по-моему нет ни какой разницы. Задача же в том, чтобы поменять местами первый и последний байты, и не зависимо от старшего бита (т.е. знака) этот код будет делать свое дело)
универсальность тоже не везде нужна, зачем городить. для других размеров числа легче переписать функцию. ну а если попытаться, то... надо подумать.
а про беззнаковость это я на будущее
0
kirich iz Che
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 19:22 #11
а если мне надо любое вводимое число, а не 15? то как изменить код
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.07.2010, 19:29 #12
Цитата Сообщение от Kastaneda Посмотреть сообщение
А по поводу знаковое\беззнаковое, то в данном случае по-моему нет ни какой разницы.
Разница есть при сдвиге знакового числа влево. Если старший бит установлен, то после сдвига на k бит старшие k бит числа будут установлены, если не установлен - сброшены.
0
kirich iz Che
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 20:48 #13
а как сделать чтобы было не 15, а любое число, которое я введу?
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.07.2010, 20:50 #14
Цитата Сообщение от kirich iz Che Посмотреть сообщение
а как сделать чтобы было не 15, а любое число, которое я введу?
также. главное чтобы тип переменной был тот же.

Добавлено через 40 секунд

Не по теме:

по-моему ни одного примера с число 15 тут и не было xD

0
kirich iz Che
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 20:54 #15
Цитата Сообщение от fasked Посмотреть сообщение
также. главное чтобы тип переменной был тот же.

Добавлено через 40 секунд

Не по теме:

по-моему ни одного примера с число 15 тут и не было xD

а почему тогда начальное число мы берем как 123456789?
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.07.2010, 21:07 #16
Цитата Сообщение от kirich iz Che Посмотреть сообщение
а почему тогда начальное число мы берем как 123456789?
А есть разница?
0
kirich iz Che
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 21:12 #17
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
А есть разница?
ну ввожу я число 2,
почему оно будет 0х123456789 , я не понимаю
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.07.2010, 21:16 #18
Цитата Сообщение от kirich iz Che Посмотреть сообщение
ну ввожу я число 2,
почему оно будет 0х123456789 , я не понимаю
2 оно и в Африке 2. Ввод добавь.
C++
1
2
3
4
5
6
unsigned int dword;
std::cin >>  dword;
 
dword = (dword << 24) | (dword & 0x00FFFF00) | (dword >> 24);
 
std::cout << dword;
0
kirich iz Che
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 21:28 #19
это вся прога Оо
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.07.2010, 21:37 #20
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{
   unsigned int dword;
   std::cin >>  dword;
 
   dword = (dword << 24) | (dword & 0x00FFFF00) | (dword >> 24);
 
   std::cout << dword;
}
вот теперь вся
0
04.07.2010, 21:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2010, 21:37
Привет! Вот еще темы с решениями:

В числе поменять местами цифры
Дано число ABCDEF.GHIKLM(в котором буквы – это любые цифры (0..9)) в этом числе...

N-значное число, вывести младший и старший разряд
Составить программу. Дано n-значное число longint. Произвести с ним действия...

Как поменять цифры в числе местами?
Помогите, пожалуйста, с задачей Нам дано: натуральное число, запись которого...

Младший и старший байт и запись 16 битных чисел на ардуино
Доброе утро коллеги! Изучаю протокол один, и тут нужно : 1) Записать данные с...


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

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

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