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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 64, средняя оценка - 4.64
Leshiy1
0 / 0 / 0
Регистрация: 03.04.2010
Сообщений: 153
#1

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

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

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

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

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

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

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

Поменять цифры в числе местами - C++
салам!) помогите решить одну задачу, нужно вывести число цифрами наоборот. например: вводотся 45-выводится 54 НО если вводится 20 или...

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

N-значное число, вывести младший и старший разряд - C++
Составить программу. Дано n-значное число longint. Произвести с ним действия согласно варианту ( 17 ) Вывести только цифры самого...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
easybudda
Модератор
Эксперт CЭксперт С++
9627 / 5575 / 947
Регистрация: 25.07.2009
Сообщений: 10,710
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 / 0
Регистрация: 03.04.2010
Сообщений: 153
07.04.2010, 16:41  [ТС] #3
Спасибо большое за код
0
kirich iz Che
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 25
03.07.2010, 13:20 #4
на c++ можете написать плиз?
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 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 / 0
Регистрация: 29.03.2010
Сообщений: 25
03.07.2010, 19:56 #6
поясни плиз что происходит, а способ как раз то что нужно, через смещения)
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 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
Эксперт С++
4936 / 2516 / 180
Регистрация: 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
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 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
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.07.2010, 14:50 #10
Цитата Сообщение от Kastaneda Посмотреть сообщение
Ну да, можно и так, а цикл - это попытка (как я уже писал - неудачная) сделать код универсальным, на случай если int = 2 байта. А по поводу знаковое\беззнаковое, то в данном случае по-моему нет ни какой разницы. Задача же в том, чтобы поменять местами первый и последний байты, и не зависимо от старшего бита (т.е. знака) этот код будет делать свое дело)
универсальность тоже не везде нужна, зачем городить. для других размеров числа легче переписать функцию. ну а если попытаться, то... надо подумать.
а про беззнаковость это я на будущее
0
kirich iz Che
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 19:22 #11
а если мне надо любое вводимое число, а не 15? то как изменить код
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.07.2010, 19:29 #12
Цитата Сообщение от Kastaneda Посмотреть сообщение
А по поводу знаковое\беззнаковое, то в данном случае по-моему нет ни какой разницы.
Разница есть при сдвиге знакового числа влево. Если старший бит установлен, то после сдвига на k бит старшие k бит числа будут установлены, если не установлен - сброшены.
0
kirich iz Che
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 20:48 #13
а как сделать чтобы было не 15, а любое число, которое я введу?
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 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 / 0
Регистрация: 29.03.2010
Сообщений: 25
04.07.2010, 20:54 #15
Цитата Сообщение от fasked Посмотреть сообщение
также. главное чтобы тип переменной был тот же.

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

Не по теме:

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

а почему тогда начальное число мы берем как 123456789?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2010, 20:54
Привет! Вот еще темы с ответами:

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

Поменять местами первую и последнюю цифру в числе - C++
Здравствуйте, я в C++ новичок и мне очень нужна помощь. Дано некое число, которое вбивает пользователь, надо поменять в этом числе первую и...

Поменять в четырехзначном числе вторую и третью цифру местами - C++
Дано целое четырехзначное число n (n&gt;0). Поменять в числе вторую и третью цифру местами

В трехзначном числе поменять местами первую и последнюю цифры - C++
Условие: разработать функцию которая в трехзначном числе меняет местами первую и последнию цифру с++ Разработал функцию, но вот что в...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.07.2010, 20:54
Ответ Создать тему
Опции темы

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