Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
10 / 4 / 3
Регистрация: 29.01.2016
Сообщений: 131
1

Побитовые операции

29.10.2017, 21:09. Показов 592. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача:
Функция setbits(x, p , n, y) которая возвращает x, в котором n битов, начиная с позиции p, равный n крайним правым битам аргумента y, а остальные не трогать.
Например: set(x, 5, 4, y)
x = 1 0 1 0 1 1 0 1
y = 1 1 0 1 0 1 1 1
рез 1 0 0 1 1 1 0 1

C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
unsigned setbit(unsigned x, int p, int n, unsigned y){
    return (((~0 << n) >> 8-p+1) ^ x) | ((y << 8-n) >> 8 - p + 1);
}
int main(){
    printf("%d", setbit(173, 5, 4, 215));
    return 0;
}
Казалось бы правильно написал но из за того что операция >>(сдвиг справа) числа со знаком в некоторых системах приводит к заполнению этих битов значением знакового бита(1) а в других нулям, и ошибка уже начинается в первой операции
((~0 << n) >> 8-p+1)

Или задачку можно решить более тривиально?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2017, 21:09
Ответы с готовыми решениями:

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

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

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

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

6
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
29.10.2017, 22:44 2
Использовать unsigned для всех параметров.
1
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
29.10.2017, 23:30 3
Цитата Сообщение от EpicSR Посмотреть сообщение
Казалось бы правильно написал но из за того что операция >>(сдвиг справа) числа со знаком в некоторых системах приводит к заполнению этих битов значением знакового бита(1) а в других нулям, и ошибка уже начинается в первой операции
((~0 << n) >> 8-p+1)
Вместо "0" пиши "0u", чтобы он был беззнакового типа. В этом случае сдвиг вправо будет старшие биты заполнять нулями

Добавлено через 37 секунд
Ну или вместо "~0" написать "(unsigned)(~0)". Сути дела не меняет, просто выбери то, что проще читается
1
10 / 4 / 3
Регистрация: 29.01.2016
Сообщений: 131
30.10.2017, 11:20  [ТС] 4
likehood, Evg,
Круто, чем дальше тем больше мне Си начинает нравиться.

Добавлено через 9 минут
Посмотрел я потом в книге ответов, там алгоритм, точнее последовательность такая:
C
1
2
3
...
return x & ~(~(~0 << n) <<(p+1-n)) | (y & ~(~0 << n)) << (p+1-n);
...
Чей код лучше(понятнее), мой или который в книге ответов? Если словесно описать эти два кода то они делают примерно одинаковую последовательность действий.
0
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
30.10.2017, 19:08 5
EpicSR, я для себя...

Цитата Сообщение от EpicSR Посмотреть сообщение
Функция setbits(x, p , n, y) которая возвращает x, в котором n битов, начиная с позиции p, равный n крайним правым битам аргумента y, а остальные не трогать.
Вообще ничего не понял.

Цитата Сообщение от EpicSR Посмотреть сообщение
Например: set(x, 5, 4, y)
x = 1 0 1 0 1 1 0 1
y = 1 1 0 1 0 1 1 1
рез 1 0 0 1 1 1 0 1
То бишь, мы берем первые 4 бита, начиная с 5-го по счету переменной y, после чего копируем эти биты в x. Но куда? В какое место копируем? "Всерединку"?
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
30.10.2017, 20:40 6
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Но куда?
Вероятно, в позицию "p"

Добавлено через 1 минуту
Правда пример соответствует p == 2, а не 4
0
10 / 4 / 3
Регистрация: 29.01.2016
Сообщений: 131
30.10.2017, 23:31  [ТС] 7
Цитата Сообщение от Captain Maxee Посмотреть сообщение
То бишь, мы берем первые 4 бита, начиная с 5-го по счету переменной y, после чего копируем эти биты в x. Но куда? В какое место копируем? "Всерединку"?
В моем примере мы берем первые 4(параметр n = 4) бита числа y (выделил которые берем) y = 1 1 0 1 0 1 1 1, потом эти биты вставляем в число x начиная с 5(параметр p = 5) разряда числа,
получается вместо голубых x = 1 0 1 0 1 1 0 1

Итого у нас есть два числа выбранные по выше описанному алгоритму:
y = 1 1 0 1 0 1 1 1
x = 1 0 1 0 1 1 0 1

Мы должны возвратить число в котором вместо голубых битов вставлены оранжевые, а остальные черные биты числа x не трогать.
Результат = 1 0 0 1 1 1 0 1

Напоминаю что разряды начинаются с хвоста числа и первый разряд нумеруются с 0. И так до 7 если число одно байтовое, в одном байте 8 битов как правило.
x = [7]1 [6]0 [5]1 [4]0 [3]1 [2]1 [1]0 [0]1 - в квадратных скобках номер разряда числа, потом само значение.
0
30.10.2017, 23:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2017, 23:31
Помогаю со студенческими работами здесь

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

Побитовые операции, основы
Вывести в десятичном виде поле длины k двоичного представления данного натурального числа слева от...

Задача на побитовые операции
Дана такая задача: 1. Реализовать задание при помощи побитовых логических операций. Программа...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru