Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
non_grata
3 / 3 / 0
Регистрация: 07.10.2017
Сообщений: 18
1

Побитовые операции по книге Кевина Митника(функция getbits)

22.10.2017, 00:01. Просмотров 290. Ответов 2
Метки нет (Все метки)

Всем привет, я снова к вам за помощью, как говорится, чем дальше в лес, тем больше дров. На этот раз столкнулся с такими трудностями:
...Для иллюстрации некоторых побитовых операций рассмотрим функцию getbits(x, p, n), которая
формирует поле в n битов, вырезанных из х, начиная с позиции p, прижимая его к правому краю.
Предполагается, что 0-й бит — крайний правый бит, а n и p — осмысленные положительные числа.
Например, getbits(x, 4, 3) вернет в качестве результата 4, 3 и 2-й биты значения х, прижимая их к
правому краю. Вот эта функция:
C
1
2
3
4
unsigned getbits(unsigned х, int p, int n)
{
return (x >> (p+1-n)) & ~(~0 << n);
}
Для начала напишу, как я понял саму функцию, а затем задам пару вопросов:
для примера я взял x = 11 ( 0000 0000 0000 0000 0000 0000 0000 1011 )
x = 11; p = 4; n = 3;
1) x >> (p+1-n)
[11 >> 2]
0000 0000 0000 0000 0000 0000 0000 0010 | 11 - [остаток, который отбрасываем]
2) ~(~0 << n)
0000 0000 0000 0000 0000 0000 0000 0000 - [0]
1111 1111 1111 1111 1111 1111 1111 1111 - [~0]
1111 1111 1111 1111 1111 1111 1111 1000 - [~0 << 3]
0000 0000 0000 0000 0000 0000 0000 0111 - [~(~0<<3)]
3) 11 >> 2 & ~(~0 << 3)
0000 0000 0000 0000 0000 0000 0000 0010 - [11 >> 2]
0000 0000 0000 0000 0000 0000 0000 0111 - [применяем побитовое И - & ]
0000 0000 0000 0000 0000 0000 0000 0010 - [1*2^1 = 2]
В таком случае у меня выведет число 2.

Теперь, собственно говоря, к вопорсам:
1) Правильно ли я "вычислил" функцию? Если нет, то остальные вопросы можно не читать)
2) Сказано, что вернет 4,3,2 биты значения х. Но я экспериментально доказал, что в моем случае вернет только 2 бит. Это какая-то описка или же я что-то не так понял?)
3) Что значит прижимая к правому краю(сказано в условии). Это лишь дополнительная информация, которая ни на что не влияет или что-то важное, без чего нельзя обойтись.
p.s Если кто-то захочет ответить на вопросы, то прошу сделать это максимально развернуто. Заранее Спасибо)
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2017, 00:01
Ответы с готовыми решениями:

Побитовые операции
При написании функций можно использовать только следующее: - целочисленные...

Побитовые операции
Есть число 0x7с1b. Перевожу его в двоичный вид - 0111110000011011. Каждый бит...

Побитовые операции
Доброго времени суток. Читаю KR, добрался до упражнения 2.9: Применительно к...

Побитовые операции
Даны два целых положительных числа А и В.: 1. Определить значение каждого...

Побитовые операции
Задача: Функция setbits(x, p , n, y) которая возвращает x, в котором n битов,...

2
tmpValue
41 / 74 / 15
Регистрация: 04.10.2017
Сообщений: 284
22.10.2017, 00:36 2
Цитата Сообщение от non_grata Посмотреть сообщение
Правильно ли я "вычислил" функцию?
Да.
Цитата Сообщение от non_grata Посмотреть сообщение
Сказано, что вернет 4,3,2 биты значения х. Но я экспериментально доказал, что в моем случае вернет только 2 бит.
Всё верно. Вернет n бит начиная с позиции p. Смотри по пунктам (твоим):
1. Вычисляешь сколько ненужных бит справа и сдвигаешь. Тем самым ты их просто ликвидируешь.
2. Вычисляешь сколько тебе необходимо значимых бит и устанавливаешь их в единицу. Это маска.
3. Делаешь побитовое И с маской для того чтобы необходимые биты либо обнулить, либо оставить как 1.
Итог: ты получил число, первые три бита которого были вычислены из исходного. Просто нулевой и второй бит (в исходном 2й и 4й соответственно) не были установлены. В чем ты и убедился.
1
non_grata
3 / 3 / 0
Регистрация: 07.10.2017
Сообщений: 18
22.10.2017, 01:57  [ТС] 3
Пока писал еще порцию вопросов, то во всем окончательно разобрался. Спасибо Вам огромное, все очень доступно объяснили.

p.s Приношу свои извинения всем тем, кого я ввел в заблуждение и написал "по книге Кевина Митника". Я имел в виду Брайана Кернигана, просто друг написал в момент составления вопроса и я описался.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2017, 01:57

Побитовые операции с float
Установить в заданное пользователем состояние определённое количество рядом...

Задача на падежи (побитовые операции)
Есть задача: К введенному числу (от 0 до 99) приписать слово «копеек» в...

Побитовые операции - разобрать пример
Доброго времени суток, уважаемые программисты! Помогите разобраться с...


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

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

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