Можно ли сказать, какое сравнение элементов массива привело к истине? - PullRequest
0 голосов
/ 28 декабря 2011

у меня есть трехмерный массив, который я использую в качестве таблицы битов

   char bit_table_[X][Y][Z];

X не больше 20, но Y и Z будут очень большими.содержимое Y и Z каждого X будет сравниваться параллельно следующим образом (здесь действительные значения Y и Z будут вычисляться с использованием некоторых хеш-функций).Моя проблема в том,Я не знаю, есть ли какой-нибудь способ сказать, какой из X дает истину в проверке состояния if if

if (((bit_table_[0][i][bit_index / bits_per_char]|
bit_table_[1][i][bit_index / bits_per_char])& bit_mask[bit]) != bit_mask[bit])
     return true;

, или есть какой-то другой способ сделать это?

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Вы должны проверить их индивидуально, чтобы узнать, какой из них привел к истине.Вот пример использования логического, а не побитового ИЛИ, чтобы определить, какой из них привел к истине.

bool x1 = false, x2 = false;

if(
   (x1 = (bit_table_[0][i][bit_index/bits_per_char] & bit_mask[bit]) != bit_mask[bit]) ||
   (x2 = (bit_table_[1][i][bit_index/bits_per_char] & bit_mask[bit]) != bit_mask[bit])
  )
{
    //Check x1 and x2 here
    return true;
}

Редактировать:

Чтобы расширить предыдущий пример и удовлетворить результаты вашегоВ оригинальном сообщении вы также можете проверить, является ли комбинация того и другого причиной, по которой она проходит, так:

bool x1 = false, x2 = false, both = false;
size_t zindex = bit_index/bits_per_char;
if(
   (x1 = (bit_table_[0][i][zindex] & bit_mask[bit]) != bit_mask[bit]) ||
   (x2 = (bit_table_[1][i][zindex] & bit_mask[bit]) != bit_mask[bit]) ||
   (both = ((bit_table_[0][i][zindex] | bit_table_[1][i][zindex]) &
            bit_mask[bit]) != bit_mask[bit])
  )
{
    //Check x1 and x2 here
    //If both is true then neither x1 or x2 resulted in true alone

    return true;
}
0 голосов
/ 28 декабря 2011

решение вашего вопроса простое: оператор if верен, только если содержимое массива для x = 0 и x = 1 имеет одинаковое значение: 0. Предположим, что массив содержит только двоичные значения (0 или 1) if ( (0 | 0 )& 1 ! = 1) верно во всех других случаях для bit_array или bit_mask сделать оператор ложным !!


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

простой пример, если вы пишете if((0x0F | 0xF0) == 0), когда условие истинно, ни 0x0F, ни 0xF0 не делают его истинным!это объединение двух, которые делают условие истинным.

это то же самое в вашем if утверждении.

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