IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Обмен битов в двоичном представлении числа, Си
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Дано целое неотрицательное число. Произвести в его двоичном представлении обмен битов с номерами 0 и 1, 2 и 3, 4 и 5 и так далее.

Объясните пожалуйста, каким способом нужно производить обмен? Как это вообще будет выглядеть?

Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Ну вот давай посмотрим на примере конкретного числа... Не будем уходить далеко от примера, возьмём то же самое число 0xA7:

Цитата
00000000 10100111

Теперь смотри... Нам надо поменять местами пары битов, так? Какие возможны сочетания 2-х бит? 00, 01, 10, 11 - это как раз индексы массива b... А значения массива b - это значения уже изменённого порядка битов, т.е., 00 меняем местами - получаем 00, результат = 0, 01 меняем биты местами - получаем 10 = 2, и т.д.

Что происходит дальше? Находим f, сдвигая само число на i бит вправо (то есть, добиваясь того, чтобы те биты, которые надо менять местами, были двумя самыми правыми битами), и "умножаем" полученное число логически на 3, т.е. применяем операцию AND:
Цитата
00000000 10100111
and
00000000 00000011
-----------------------
00000000 00000011

Учти, при этом значение n не изменяется, работа производится с его копией!!! Это важно...

Теперь в f содержится значение неизменённых битов... Тогда b[f] будет содержать значение уже изменённого порядка битов...

Теперь самая сложная строка:
n = (n & (~(3 << i))) | (b[f] << i);

Здесь делается следующее... Ну, значение изменённого порядка битов мы нашли, только его же надо еще поставить на нужное место в числе, правда? А где это нужное место? Правильно, на первой итерации - это прямо последние 2 бита, для второй - 2 предыдущих, т.е. 2 и 3, считая от 0... В общем случае - это биты, находящиеся на тех же местах, что и единичные биты в (3 << i)...

Приближаемся к развязке этого выражения: допустим, у тебя есть число n = 00001011, и тебе надо обнулить значения выделенных битов, оставляя все остальные неизменными; что надо для этого сделать? Надо произвести AND с инвертированной маской битов, т.е., маска = 00001100, инвертированная маска = 11110011, и когда мы сделаем AND, то все биты, кроме нулевых останутся теми же, а нулевые - сбросятся, потому что 0 and X = 0...

Ты думаешь, а зачем я это все рассказываю? Да потому что в приведённой выше строке на С, я делаю именно это: значению n производится операция and со сдвинуто1 на нужное количество бит и инвертированной 3-кой, этим мы гарантированно сбрасываем те биты, куда должны будем записать значение b[f], а потом к этому вот промежуточному значению "прибавляем" (операция OR) сдвинутое опять же на нужное число бит значение b[f]...

Я понимаю, что это все выглядит очень сложно, но все-таки постарайся понять, это основы работы с битами, без этого более сложные операции (а они могут быть ГОРАЗДО более сложными, поверь мне) ты не сможешь понимать...
 К началу страницы 
+ Ответить 

Сообщений в этой теме
18192123   Обмен битов в двоичном представлении числа   14.05.2007 22:35
Malice   Поменять можно так: b:=x and 3; взяли 2 …   15.05.2007 1:40
volvo   На С можно это уложить в одно выражение... Только…   15.05.2007 1:43
18192123   На С можно это уложить в одно выражение... Тольк…   15.05.2007 2:03
volvo   Вроде вот так должно быть... #include <stdio.h…   15.05.2007 4:05
18192123   Вроде вот так должно быть... unsigned int b[4…   16.05.2007 20:04
18192123   Объясни пожалуйста, для чего мы используем массив…   17.05.2007 0:28
18192123   for(i = 0; i < 8*sizeof(int); i += 2) …   17.05.2007 4:06
18192123   f = (n >> i) & 3; n = (n …   18.05.2007 1:36
volvo   Ну вот давай посмотрим на примере конкретного числ…   17.05.2007 1:03
18192123   Что происходит дальше? Находим f, сдвигая само ч…   17.05.2007 4:15
18192123   "умножаем" полученное число логически …   17.05.2007 4:46
volvo   А чтобы не заниматься работой, которую должен дела…   17.05.2007 4:13
volvo   Потому что так проще всего их выделить... Не поня…   17.05.2007 4:20
volvo   Сколько битов нам надо выделить, помнишь? Где они …   17.05.2007 4:54
volvo   Можно, но тогда сразу говори в следующий раз, что …   18.05.2007 21:26


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 17.04.2024 6:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name