Битовое программирование на C - PullRequest
1 голос
/ 03 марта 2011

Эй, у меня были проблемы с программой на Си.Программа, которую я должен написать, имитирует работу компьютера VAX.Я должен взять в 2 переменных х и у, чтобы сгенерировать z.при этом есть две функции, первая

  • устанавливает Z в 1, где каждая битовая позиция y = 1
  • 2nd устанавливает z в 0, где каждая битовая позиция y = 1

Я не прошу, чтобы кто-то сделал это для меня, мне просто нужно объяснить, как это делается, поскольку у меня есть голые две функции, которые мне нужны.Я думал о чем-то подобном, но я не знаю, правильно ли это вообще.

#include<stdio.h>

int main()
{
   int x1 = 1010;
   int y1 = 0101;

   bis(x1, y1);
   bic(x1, y1);
}

/* BIT SET function that sets the result to 1 wherever y = 1 */
int bis (int x, int y)
{
   int z = x & y;

   int result = ?;
   printf("BIT SET: \n\n", result);
   return result;
}

/* BIT CLEAR function that sets result to 0 wherever y = 1 */
int bic(int x, int y)
{
   int z = x & y;

   int result = ?;
   printf("BIT CLEAR:\n\n ", result);
   return result;
}

Извиняюсь за плохие соглашения об именах.Я в любом случае на правильном пути для этой программы?

Ответы [ 2 ]

3 голосов
/ 03 марта 2011

Давайте сначала посмотрим на bitset ().Я не буду публиковать код на C, но мы можем решить это на бумаге для начала.

Скажем, у вас есть целые числа со следующими битовыми комбинациями: x = 1011 и y = 0101.(Я изменяю номера вашего примера. И, кстати, это не то, как вы бы определили два целых числа, имеющие эти битовые комбинации, но сейчас мы фокусируемся на логике.)

Если я правильно понимаю, когда вы звоните bitset(x, y), вы хотите, чтобы ответ Z равнялся 1111.

x = 1011
y = 0101
     ^ ^-------- Because these two bits have the value 1, then your answer also
                 has to set them to 1 while leaving the other bits in x alone.

Хорошо, какая побитовая операция выполнит это?У вас есть AND (&), OR (\), XOR (^) и COMPLEMENT (~).

В этом случае вы используете OR для двух значений.Глядя на следующую таблицу истинности:

x        1 0 1 1
y        0 1 0 1
-----------------
(x OR y) 1 1 1 1

Каждый бит в последней строке задается ORing этого столбца в x и y.Итак (1 ИЛИ 0) = 1, (0 ИЛИ 1) = 1, (1 ИЛИ 0) = 1, (1 ИЛИ 1) = 1

Итак, теперь вы можете написать набор битов функции C (x,y), ORs x и y, и возвращает результат в виде Z.

Какой побитовый оператор - и вы можете сделать это в несколько шагов с несколькими операторами - вы бы использовали для очистки битов?

                                x  1 0 1 1
                                y  0 1 0 1
-------------------------------------------
(SOME OPERATONS INVOLVING x and y) 1 0 1 0

Какими будут эти логические операторы (из списка выше)?Подумайте об операторах «и» и «дополнение».

Удачи вам в игре!

Бонус: быстрый учебник по выражению целых чисел в C.

int x = 1337 создает целое число и присваивает ему значение 1337.Если вы сказали x = 01337, то x НЕ будет иметь значение «1337», как вы могли ожидать.Помещая 0 перед числом, вы говорите С, что это число в восьмеричном (основание 8).Цифры "1337", интерпретируемые в основании 8, эквивалентны десятичному (основание 10) 735. Если вы сказали x = 0x1337, то вы выражаете число в основании 16 как шестнадцатеричное, эквивалентное 4919 в основании 10.

0 голосов
/ 03 марта 2011

Нет ... что у вас там будет и вместе два целых числа.Один из которых - 1010 (base10), а другой - 101 (base 8 - восьмеричное -> 65 base 10).

Сначала вы захотите объявить свои константы как двоичные (добавив к ним префикс0b).

Во-вторых, вы захотите поместить их (для вашего инструктора или TA) в двоичное представление.Проверьте этот вопрос для большего количества идей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...