|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.03.2013, 21:09 | #1 | |
Пользователь
Регистрация: 08.04.2012
Сообщений: 10
|
Битовые операции на чистом Си
Добрый вечер, форумчане, нужна ваша помощь, никак не могу додуматься, как сделать это задание:
Цитата:
Задание нужно выполнить на чистом Си. Вот мои наработки: Код:
Надеюсь на вашу помощь! |
|
17.03.2013, 22:00 | #2 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,341
|
Код:
Нумерация битов от младшего к старшему, начиная с 0 (справа налево, если смотреть на текстовое представление).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
|
17.03.2013, 22:11 | #3 |
Пользователь
Регистрация: 08.04.2012
Сообщений: 10
|
исходное задание делается для типа данных double(long doble)
В вашем коде, при попытке ввода числа 15.375 наблюдаю такую картину наблюдаю такую картину Последний раз редактировалось doojkee; 17.03.2013 в 22:56. |
17.03.2013, 22:53 | #4 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,341
|
Я думал, что использование double, просто Ваша прихоть.
Предыдущий код работает только с целыми числами. Код:
Разберу способ на предыдущем коде. Если нужно поставить k-й бит в единицу, то получаем число с k-м единичным битом и остальными нулями (1 << k). Затем делаем побитовое "или" с исходным числом, тем самым "поднимая" требуемый бит. Если нужно, наоборот, опустить k-й бит, то нужно создать битовую маску из единиц, в которой на месте требуемого бита будет 0. Сначала получаем число, в котором на k-ом месте стоит единица, затем инвертируем биты и получаем требуемую маску. Побитовое "и" "опустит" k-й бит.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
Последний раз редактировалось BDA; 17.03.2013 в 22:58. |
17.03.2013, 22:58 | #5 |
Пользователь
Регистрация: 08.04.2012
Сообщений: 10
|
Если вам не сложно, не могли бы прокомментировать данный цикл, что в нем происходит и каким образом!
Код:
Код:
Желательно поподробней, спасибо! Я просто только учусь программировать на Си, поэтому для меня многие моменты не до конца ясны. Последний раз редактировалось doojkee; 17.03.2013 в 23:24. |
17.03.2013, 23:06 | #6 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,341
|
Во-первых, не цитируйте полностью такие длинные сообщения.
Во-вторых, само объяснение: Верхняя строка - то, как мы привыкли видеть нумерацию битов в числе, когда записываем их на бумаге. Нижняя строка - как на самом деле будут храниться байты в памяти (так называемый little-endian - порядок от младшего к старшему). То есть первый (нулевой в нумерации Си) байт массива "а" будет хранить самый младший байт числа "m". Для вывода числа мы идем циклом от самого большого номера бита к самому маленькому. Нам нужно брать правильный бит из правильного байта. По картинке несложно заметить, что целая часть от номера i указывает на требуемый байт, а остаток - на нужный бит. UPD Пожалуйста
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
Последний раз редактировалось BDA; 17.03.2013 в 23:22. |
17.03.2013, 23:18 | #7 |
Пользователь
Регистрация: 08.04.2012
Сообщений: 10
|
Прошу прощения за тупые вопросы, но все же хочу до конца разобраться!
(i%8), что это операция? Операции |= и &=, интерпретируются так как и +=? Последний раз редактировалось doojkee; 17.03.2013 в 23:29. |
17.03.2013, 23:25 | #8 |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
BDA, прикалываешься что-ли?
В "чистом C нет++). Это С++ Для "чистого" С, a = a+1;
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder Последний раз редактировалось Smitt&Wesson; 17.03.2013 в 23:28. |
17.03.2013, 23:34 | #9 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,341
|
doojkee, i%8 - остаток i от деления на 8.
|= и &= работают также (одинаковая семантика, вроде так это называется ), как и +=, т.е. a |= 2 то же самое, что и a = a|2. Smitt&Wesson, честно говоря, первый раз такое слышу - полтора года пишу ++, компилирую в gcc и думаю, что пишу на чистом Си.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
Последний раз редактировалось BDA; 17.03.2013 в 23:38. |
17.03.2013, 23:41 | #10 | |
Пользователь
Регистрация: 08.04.2012
Сообщений: 10
|
Цитата:
Последний тупой вопрос, для чего мы проверяем на остаток делания на 8? |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Битовые операции(с++) | Lazy maximka | Помощь студентам | 2 | 23.12.2010 18:55 |
Битовые операции СИ | savra | Помощь студентам | 0 | 10.03.2010 19:31 |
Битовые операции | ("")(Э_Є)("") | Общие вопросы C/C++ | 4 | 03.07.2009 19:15 |
Битовые операции | DrAlexx2121 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 4 | 14.06.2008 22:26 |