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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 64, средняя оценка - 4.64
Leshiy1
 Аватар для Leshiy1
0 / 0 / 0
Регистрация: 03.04.2010
Сообщений: 153
07.04.2010, 16:33     В числе 15 поменять местами младший и старший байты #1
Здравствуйте всем
объясните пожалуйста как например в числе 15 поменять местами младший и старший байты
(Я Си изучаю только два дня)

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

C++ Поменять местами старший и младший полубайты
В числе поменять местами цифры C++
C++ Поменять цифры в числе местами
C++ Как поменять цифры в числе местами?
C++ Поменять местами левый и правый байты целого аргумента
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
07.04.2010, 16:39     В числе 15 поменять местами младший и старший байты #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;
}
Leshiy1
 Аватар для Leshiy1
0 / 0 / 0
Регистрация: 03.04.2010
Сообщений: 153
07.04.2010, 16:41  [ТС]     В числе 15 поменять местами младший и старший байты #3
Спасибо большое за код
kirich iz Che
 Аватар для kirich iz Che
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 25
03.07.2010, 13:20     В числе 15 поменять местами младший и старший байты #4
на c++ можете написать плиз?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
03.07.2010, 15:14     В числе 15 поменять местами младший и старший байты #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.
kirich iz Che
 Аватар для kirich iz Che
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 25
03.07.2010, 19:56     В числе 15 поменять местами младший и старший байты #6
поясни плиз что происходит, а способ как раз то что нужно, через смещения)
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.07.2010, 07:14     В числе 15 поменять местами младший и старший байты #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. Вот собственно и все)
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.07.2010, 09:04     В числе 15 поменять местами младший и старший байты #8
Kastaneda, я не понял зачем цикл
C
1
2
unsigned int dword = 0x11223344;
dword = (dword << 24) | (dword & 0x00FFFF00) | (dword >> 24);
кстати, для битовых операций, лучше пользоваться беззнаковыми представлениями чисел, иначе результат может быть непредсказуемым.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.07.2010, 09:27     В числе 15 поменять местами младший и старший байты #9
Цитата Сообщение от fasked Посмотреть сообщение
Kastaneda, я не понял зачем цикл
C
1
2
unsigned int dword = 0x11223344;
dword = (dword << 24) | (dword & 0x00FFFF00) | (dword >> 24);
кстати, для битовых операций, лучше пользоваться беззнаковыми представлениями чисел, иначе результат может быть непредсказуемым.
Ну да, можно и так, а цикл - это попытка (как я уже писал - неудачная) сделать код универсальным, на случай если int = 2 байта. А по поводу знаковое\беззнаковое, то в данном случае по-моему нет ни какой разницы. Задача же в том, чтобы поменять местами первый и последний байты, и не зависимо от старшего бита (т.е. знака) этот код будет делать свое дело)
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.07.2010, 14:50     В числе 15 поменять местами младший и старший байты #10
Цитата Сообщение от Kastaneda Посмотреть сообщение
Ну да, можно и так, а цикл - это попытка (как я уже писал - неудачная) сделать код универсальным, на случай если int = 2 байта. А по поводу знаковое\беззнаковое, то в данном случае по-моему нет ни какой разницы. Задача же в том, чтобы поменять местами первый и последний байты, и не зависимо от старшего бита (т.е. знака) этот код будет делать свое дело)
универсальность тоже не везде нужна, зачем городить. для других размеров числа легче переписать функцию. ну а если попытаться, то... надо подумать.
а про беззнаковость это я на будущее
kirich iz Che
 Аватар для kirich iz Che
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 19:22     В числе 15 поменять местами младший и старший байты #11
а если мне надо любое вводимое число, а не 15? то как изменить код
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.07.2010, 19:29     В числе 15 поменять местами младший и старший байты #12
Цитата Сообщение от Kastaneda Посмотреть сообщение
А по поводу знаковое\беззнаковое, то в данном случае по-моему нет ни какой разницы.
Разница есть при сдвиге знакового числа влево. Если старший бит установлен, то после сдвига на k бит старшие k бит числа будут установлены, если не установлен - сброшены.
kirich iz Che
 Аватар для kirich iz Che
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 20:48     В числе 15 поменять местами младший и старший байты #13
а как сделать чтобы было не 15, а любое число, которое я введу?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.07.2010, 20:50     В числе 15 поменять местами младший и старший байты #14
Цитата Сообщение от kirich iz Che Посмотреть сообщение
а как сделать чтобы было не 15, а любое число, которое я введу?
также. главное чтобы тип переменной был тот же.

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

Не по теме:

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

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

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

Не по теме:

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

а почему тогда начальное число мы берем как 123456789?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.07.2010, 21:07     В числе 15 поменять местами младший и старший байты #16
Цитата Сообщение от kirich iz Che Посмотреть сообщение
а почему тогда начальное число мы берем как 123456789?
А есть разница?
kirich iz Che
 Аватар для kirich iz Che
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 21:12     В числе 15 поменять местами младший и старший байты #17
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
А есть разница?
ну ввожу я число 2,
почему оно будет 0х123456789 , я не понимаю
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.07.2010, 21:16     В числе 15 поменять местами младший и старший байты #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;
kirich iz Che
 Аватар для kirich iz Che
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 21:28     В числе 15 поменять местами младший и старший байты #19
это вся прога Оо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2010, 21:37     В числе 15 поменять местами младший и старший байты
Еще ссылки по теме:

C++ Поменять местами старший и младший полубайт беззнакового короткого целого
C++ В трехзначном числе поменять местами первую и последнюю цифры
Поменять в четырехзначном числе вторую и третью цифру местами C++

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.07.2010, 21:37     В числе 15 поменять местами младший и старший байты #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;
}
вот теперь вся
Yandex
Объявления
04.07.2010, 21:37     В числе 15 поменять местами младший и старший байты
Ответ Создать тему
Опции темы

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