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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
sergey.shuvalov
-6 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 268
#1

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

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

Здравствуйте все.
Есть
char A=3;
char B=0;
Как переместить физическое содержание битов из байта A в байт В, чтобы стало
A=0
B=3;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2013, 12:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перемещение содержимого из одного байта в другой байт (C++):

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

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

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

Копирование содержимого одного текстового файла в другой - C++
Открытие одного текстового файла и создание другого с записью в него информации с первого открытого файла, делал так как знал короче говоря...

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

Как прочитать несколько байтов в файле с n-го байта по m-й байт ? - C++
Как прочитать несколько байтов в файле с n-го байта по m-й байт ?

32
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.07.2013, 12:23 #2
C++
1
2
3
char c = b;
b = a;
a = c;
1
castaway
Эксперт С++
4920 / 3028 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 12:31 #3
C
1
    A ^= B ^= A ^= B;
0
sergey.shuvalov
-6 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 268
15.07.2013, 12:39  [ТС] #4
А ^= это чё таке ?
0
castaway
Эксперт С++
4920 / 3028 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 12:54 #5
Это побитовая операция XOR. А такое выражение - просто trick.
1
sergey.shuvalov
-6 / 1 / 0
Регистрация: 06.11.2011
Сообщений: 268
15.07.2013, 13:29  [ТС] #6
А сдвигом как-нибудь можно сдвинуть из А в В ?
0
castaway
Эксперт С++
4920 / 3028 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 13:37 #7
Описание первого: http://en.wikipedia.org/wiki/XOR_swap_algorithm
Цитата Сообщение от sergey.shuvalov Посмотреть сообщение
А сдвигом как-нибудь можно сдвинуть из А в В ?
Без использования дополнительных переменных/регистров и с размеров исходных переменных 8 бит думаю никак.
Можно также через ассемблер: xchg ah, al
1
CheshireCat
Эксперт С++
2899 / 1248 / 78
Регистрация: 27.05.2008
Сообщений: 3,414
15.07.2013, 15:05 #8
C++
1
 A ^= B ^= A ^= B;
Цитата Сообщение от lazybiz Посмотреть сообщение
А такое выражение - просто trick.
Которое, к тому же, порождает неопределенное поведение программы. :-)
0
castaway
Эксперт С++
4920 / 3028 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 15:14 #9
В данном примере, никаких неопределенных поведений не порождает.
C
1
2
3
    char A = 'a';
    char B = 'b';
    A ^= B ^= A ^= B;
0
Dr_Quake
Заблокирован
15.07.2013, 15:16 #10
CheshireCat, Для этого и придумали стандарты C++, не так ли?

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

Перемещение содержимого из одного байта в другой байт
0
castaway
Эксперт С++
4920 / 3028 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 15:24 #13
Dr_Quake, ну так я и не говорил что это идеальный вариант на все случаи жизни. Если писать на асме и переменные уже в регистрах то вполне сойдет.
0
Dr_Quake
Заблокирован
15.07.2013, 15:33 #14
lazybiz, я про то, что в виде asm вставки в C++ переменные никогда не будут уже в регистрах.
0
castaway
Эксперт С++
4920 / 3028 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
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
15.07.2013, 15:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 15:51
Привет! Вот еще темы с ответами:

Написать программу записи содержимого из одного файла в другой : Тип файла текстовый - C++
#include &quot;StdAfx.h&quot; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main () { FILE...

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить? - C++
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может...

Вставка содержимого одного файла в середину другого - C++
Здравстуйте! возник спортивный интерес, пытаюсь реализовать тест проверки знаний, и уменьшить вероятность ошибки (чел. фактор) хочу...

функция изменяет старший байт числа на заданное значение не изменяя младший байт - C++
функция изменяет старший байт числа на заданное значение не изменяя младший байт. как можно проще


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

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

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