Невозможно применить битовую маску

Я делаю программу для лошадей. У меня лицо лошади, и я хочу применить небольшую маску. Только глаза лошади должны быть видны, когда на ней надета маска. Сначала я должен преобразовать морду лошади в цифровую форму. Для этого у меня есть набор битов, который включает 0, 0, 0 и 1 для лица лошади.

Я использую С# и разбил проблему на части:

  1. Превратите голову лошади в цифровой формат
  2. Создайте битовую маску для ношения
  3. Наденьте битовую маску на лошадь
  4. Преобразуйте цифровую лошадь в маске обратно в графику

На шаге 4 я ожидаю увидеть только глаза лошади, но я вижу только «0», который НЕ ЯВЛЯЕТСЯ ДАЖЕ ЛИЦОМ ЛОШАДИ.

Вот весь мой код, пожалуйста, не подвергайте сомнению мой ASCII-арт, он не имеет отношения к вопросу, кроме того, что это прототип, реальная программа будет иметь превосходную графику.

//the head of the horse
string head = "#      #" +
              "########" +
              "#O    O#" +
              "#      #" +
              "#      #" +
              "#=    =#" +
              " #====# " +
              "  ####  ";
//digitize the horse into bits of binary
string binaryHead = head.Replace('#', '0').Replace('=', '0').Replace(' ', '0').Replace('O', '1');
long face = Convert.ToInt64(binaryHead, 2);

//make a bit mask with holes for the eyes
string mask = "11111111" +
              "11111111" +
              "10111101" +
              "11111111" +
              "11111111" +
              "11111111" +
              "11111111" +
              "11111111";

//apply the bit mask using C#
long maskBits = Convert.ToInt64(mask, 2);
string eyesOnly = Convert.ToString(face & maskBits, 2);
//eyesOnly is "0"....WHAT??? It should be more than that. WHERE IS THE HORSE??
//It should look like this:
//              "00000000" +
//              "00000000" +
//              "01000010" +
//              "00000000" +
//              "00000000" +
//              "00000000" +
//              "00000000" +
//              "00000000";

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


person Weyland Yutani    schedule 04.06.2014    source источник
comment
@ Вадим-Котов, ты отредактировал один из лучших заголовков вопросов на SO, позор   -  person Gareth    schedule 16.10.2017
comment
@Гарет Ну, может быть. Но такие вещи более уместны на Meta SO :)   -  person Vadim Kotov    schedule 16.10.2017


Ответы (2)


face и eyesOnly не имеют общих 1-битов. maskBits оставляет все, кроме глаз. Либо поменяйте местами 0 и 1, либо используйте оператор ~, чтобы перевернуть maskBits. И дайте ему имя получше, чтобы было понятно, для чего это маска: bitmaskForNotEyes.

person usr    schedule 04.06.2014

Я думаю проблема в том-

string binaryHead = head.Replace('#', '0').Replace('=', '0').Replace(' ', '0').Replace('O', '1');
  1. Во-первых, все '#' заменяются на '0'.
  2. Затем все '=' меняются на '0'
  3. Все ' ' изменены на '0'.
  4. Наконец глаза на '1'

Итак, после конвертации голова выглядит так -

string head = "00000000" +
              "00000000" +
              "01000010" +
              "00000000" +
              "00000000" +
              "00000000" +
              " 000000 " +
              "  0000  ";

Теперь вы делаете & с ним -

string mask = "11111111" +
              "11111111" +
              "10111101" +
              "11111111" +
              "11111111" +
              "11111111" +
              "11111111" +
              "11111111";

поэтому вывод, очевидно, 0.

person brainless coder    schedule 04.06.2014
comment
пробелы равны «0» в строке заголовка. - person amnezjak; 04.06.2014