Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
2 / 5 / 0
Регистрация: 06.11.2011
Сообщений: 277
1

Перемещение содержимого из одного байта в другой байт

15.07.2013, 12:20. Показов 2799. Ответов 32
Метки нет (Все метки)

Здравствуйте все.
Есть
char A=3;
char B=0;
Как переместить физическое содержание битов из байта A в байт В, чтобы стало
A=0
B=3;
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2013, 12:20
Ответы с готовыми решениями:

Перемещение содержимого одного контейнера в другой
Нужно переместить содержимое обьекта vector в обьект list. Подскажите пожалуйста!

Работа с каталогами: перемещение содержимого одного каталога в другой
Реализовать следующую прогу - переместить содержимое одного каталога в другой каталог (используя...

Вычесть из одного массива байт другой массив байт
Здравствуйте! Подскажите что нужно сделать чтобы из одного массива байт вычесть другой массив байт!

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

32
Каратель
Эксперт С++
6601 / 4020 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
15.07.2013, 12:23 2
C++
1
2
3
char c = b;
b = a;
a = c;
1
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
15.07.2013, 12:31 3
C
1
    A ^= B ^= A ^= B;
0
2 / 5 / 0
Регистрация: 06.11.2011
Сообщений: 277
15.07.2013, 12:39  [ТС] 4
А ^= это чё таке ?
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
15.07.2013, 12:54 5
Это побитовая операция XOR. А такое выражение - просто trick.
1
2 / 5 / 0
Регистрация: 06.11.2011
Сообщений: 277
15.07.2013, 13:29  [ТС] 6
А сдвигом как-нибудь можно сдвинуть из А в В ?
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
15.07.2013, 13:37 7
Описание первого: http://en.wikipedia.org/wiki/XOR_swap_algorithm
Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
А сдвигом как-нибудь можно сдвинуть из А в В ?
Без использования дополнительных переменных/регистров и с размеров исходных переменных 8 бит думаю никак.
Можно также через ассемблер: xchg ah, al
1
Эксперт С++
2921 / 1270 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
15.07.2013, 15:05 8
C++
1
 A ^= B ^= A ^= B;
Цитата Сообщение от lazybiz Посмотреть сообщение
А такое выражение - просто trick.
Которое, к тому же, порождает неопределенное поведение программы. :-)
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
15.07.2013, 15:14 9
В данном примере, никаких неопределенных поведений не порождает.
C
1
2
3
    char A = 'a';
    char B = 'b';
    A ^= B ^= A ^= B;
0
Заблокирован
15.07.2013, 15:16 10
CheshireCat, Для этого и придумали стандарты C++, не так ли?

lazybiz, asm твой вариант - это "нечестный" метод, во-первых оно нафиг не нужно ибо xchg не умеет операнды в памяти и идёт mov как минимум несколько раз, во-вторых с асмом можно просто использовать первый попавшийся рабочий регистр как третью переменную для обмена, а это выход за дозволенную память, это уже предлагали выше с с.
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
15.07.2013, 15:21 11
Dr_Quake, цена вопроса - три операции XOR. Это много? Лишний регистр не всегда бывает под рукой. И при чем тут xchg ?
0
Заблокирован
15.07.2013, 15:22 12
lazybiz, я про другой твой вариант.

Перемещение содержимого из одного байта в другой байт
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
15.07.2013, 15:24 13
Dr_Quake, ну так я и не говорил что это идеальный вариант на все случаи жизни. Если писать на асме и переменные уже в регистрах то вполне сойдет.
0
Заблокирован
15.07.2013, 15:33 14
lazybiz, я про то, что в виде asm вставки в C++ переменные никогда не будут уже в регистрах.
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
15.07.2013, 15:51 15
Вообще я про вставку не говорил. Но раз на то пошло:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main()
{
    char a = 'a';
    char b = 'b';
 
    __asm__ __volatile__ (
    "       xchg    al, bl      ;"
    : "=a" (a), "=b" (b)
    :  "a" (a),  "b" (b)
    :
    );
 
    printf( "%c, %c\n", a, b );
 
    return 0;
}
Почему ты так уверен что "переменные никогда не будут уже в регистрах" ? Листинг дизассемблера показать?
Это маленький пример. Смысла в нем мало, поэтому придираться не стоит.
0
Эксперт С++
2921 / 1270 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
15.07.2013, 15:55 16
lazybiz, к сожалению, порождает (Ст., 1.9/15). Да, результат этого UB может совпадать с "ожидаемым" результатом, но это всего лишь везение. Гарантировать, что он будет совпадать всегда, на всех компиляторах и платформах, - нельзя.
0
Заблокирован
15.07.2013, 15:58 17
lazybiz, ну если уж на то пошло - ассоциация переменных с регистрами это очень дурно и считается чуть ли не запрещённым ещё со времён сегментного DOS16(где это имело смысл хотя бы), а с точки зрения асма - неизящно, ror ax,8 и всё, ну и посмотри что генерируется на выходе - ровно то что я писал с кучей mov(по крайней мере для gcc4 что у меня).
0
Эксперт С++
4974 / 3081 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
15.07.2013, 16:02 18
Цитата Сообщение от CheshireCat Посмотреть сообщение
на всех компиляторах
На всех компиляторах не получится. Это будет работать только на GCC.
И еще раз:
Цитата Сообщение от lazybiz Посмотреть сообщение
Это маленький пример. Смысла в нем мало, поэтому придираться не стоит.
Я лишь опровергнул слова:
Цитата Сообщение от Dr_Quake Посмотреть сообщение
переменные никогда не будут уже в регистрах
То что они там будут всегда я и не утверждал.

Добавлено через 1 минуту
Цитата Сообщение от Dr_Quake Посмотреть сообщение
ассоциация переменных с регистрами это очень дурно и считается чуть ли не запрещённым ещё со времён сегментного DOS16
Ты можешь остаться при своем мнении, я тебя переубеждать не собираюсь. Я просто опровергнул твои слова. Давай на этом и закончим.
0
Заблокирован
15.07.2013, 16:08 19
lazybiz, суть - не надо "опровергать" примеры внестандартными исключениями.

Добавлено через 5 минут
P.S. Особенно учитывая что с XOR метод ты уже рассказал. Это же старинная "задачка", только выглядит на универсальном чуть по другому.
0
2 / 5 / 0
Регистрация: 06.11.2011
Сообщений: 277
15.07.2013, 16:09  [ТС] 20
Может я не правильно сформулировал интересующий меня вопрос, но попробую сделать это ещё раз.
Есть байт char A, пусть все его ячейки пусты, кроме одной, т.е. char A =1 или 00000001.
Есть байт char В, пусть все его ячейки пусты. т.е. char B =0 или 00000000.
Вопрос.
Как дать пендаля заряду в char A, чтобы он переместился в char B, и чтобы стало так:
char A=0 или 00000000
char B=1 или 000000001
Вот в чём вопрос.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.07.2013, 16:09

Закодировать файл. Взять 7 байт. Первый бит каждого байта переместить в 8 байт
Нужно открыть бинарный файл и закодировать следующим образом. Взять 7 байт. Первый бит каждого...

Добавление содержимого одного элемента в другой
день добрый, у меня как всегда банальщина. как добавить к элементу блок, только ссылаясь на него,...

Копирование содержимого одного файла в другой
Всем доброго времени суток. Заранее извиняюсь за глупый вопрос я еще новичок. Вот решаю одну...

Копирование содержимого одного файла в другой
Как скопировать содержимое одного файла в другой используя функции CreateFile(), ReadFile() и...

Программа, которая считывает 8 байт из созданного файла MyFile.dat, начиная с 7-го байта, относительно начала, и 10 байт от конца файла
Привет, вот задание собсно Напишите программу, которая считывает 8 байт из созданного ранее файла...

Для целого числа А выделить старший байт и поставить его на место младшего байта. старший байт при этом обнулить.
Помогите пожалуйста, вообще не могу понять как делать следующее...Еще и в программе CODE BLOCKS...


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

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

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