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

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

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

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

Добавлено через 8 минут
Переменная типа int
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2010, 16:33
Ответы с готовыми решениями:

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

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

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

Для заданного целого А поменять местами старший и младший байты
Помогите с заданием: Для заданного целого А поменять местами старший и младший байты. Вывести...

24
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10880 / 6770 / 1620
Регистрация: 25.07.2009
Сообщений: 12,485
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
0 / 0 / 0
Регистрация: 03.04.2010
Сообщений: 153
07.04.2010, 16:41  [ТС] 3
Спасибо большое за код
0
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 25
03.07.2010, 13:20 4
на c++ можете написать плиз?
0
Jesus loves me
Эксперт С++
5110 / 3122 / 353
Регистрация: 12.12.2009
Сообщений: 7,899
Записей в блоге: 2
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
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 25
03.07.2010, 19:56 6
поясни плиз что происходит, а способ как раз то что нужно, через смещения)
0
Jesus loves me
Эксперт С++
5110 / 3122 / 353
Регистрация: 12.12.2009
Сообщений: 7,899
Записей в блоге: 2
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
Эксперт С++
5019 / 2598 / 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
Jesus loves me
Эксперт С++
5110 / 3122 / 353
Регистрация: 12.12.2009
Сообщений: 7,899
Записей в блоге: 2
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
Эксперт С++
5019 / 2598 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.07.2010, 14:50 10
Цитата Сообщение от Kastaneda Посмотреть сообщение
Ну да, можно и так, а цикл - это попытка (как я уже писал - неудачная) сделать код универсальным, на случай если int = 2 байта. А по поводу знаковое\беззнаковое, то в данном случае по-моему нет ни какой разницы. Задача же в том, чтобы поменять местами первый и последний байты, и не зависимо от старшего бита (т.е. знака) этот код будет делать свое дело)
универсальность тоже не везде нужна, зачем городить. для других размеров числа легче переписать функцию. ну а если попытаться, то... надо подумать.
а про беззнаковость это я на будущее
0
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 19:22 11
а если мне надо любое вводимое число, а не 15? то как изменить код
0
Эксперт С++
2331 / 1704 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.07.2010, 19:29 12
Цитата Сообщение от Kastaneda Посмотреть сообщение
А по поводу знаковое\беззнаковое, то в данном случае по-моему нет ни какой разницы.
Разница есть при сдвиге знакового числа влево. Если старший бит установлен, то после сдвига на k бит старшие k бит числа будут установлены, если не установлен - сброшены.
0
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 20:48 13
а как сделать чтобы было не 15, а любое число, которое я введу?
0
Эксперт С++
5019 / 2598 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.07.2010, 20:50 14
Цитата Сообщение от kirich iz Che Посмотреть сообщение
а как сделать чтобы было не 15, а любое число, которое я введу?
также. главное чтобы тип переменной был тот же.

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

Не по теме:

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

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

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

Не по теме:

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

а почему тогда начальное число мы берем как 123456789?
0
Эксперт С++
2331 / 1704 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.07.2010, 21:07 16
Цитата Сообщение от kirich iz Che Посмотреть сообщение
а почему тогда начальное число мы берем как 123456789?
А есть разница?
0
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 21:12 17
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
А есть разница?
ну ввожу я число 2,
почему оно будет 0х123456789 , я не понимаю
0
Эксперт С++
2331 / 1704 / 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
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 21:28 19
это вся прога Оо
0
Эксперт С++
5019 / 2598 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2010, 21:37

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Поменять местами младший и старший байты в двоичном представлении десятичного числа
Дано десятичное число 871. Необходимо поменять местами младший и старший байты в его двоичном...

Как в четырехбайтовом числе поменять местами старший и младший байт?
Помогите пожалуйста! Как в четырехбайтовом числе поменять местами старший и младший байт

Выделить младший и старший байты из двухбайтового целого
Всем здравствуйте. Как выделить из UShort младший и старший байты? Если число записано в коде...

В каждом четном числе поменять местами младший байт со старшим
В каждом четном числе поменять местами младший байт со старшим. После замены определить количество...


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

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

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