讓我們考慮一個bidimensionnal陣列,聲明如下:關於散列函數
#include <stdbool.h>
bool array[N1][N2];
我要知道這個數組的每一行是否在同一位置只有一個true
值。
比如下面是確定:
{
{ 1, 0, 1, 0 },
{ 1, 0, 0, 1 },
{ 0, 0, 1, 1 }
}
而這是不正確的:
{
{ 1, 0, 1, 0 },
{ 1, 0, 1, 0 },
{ 0, 0, 1, 1 }
}
我已經試過這樣:
static uintmax_t hash(const bool *t, size_t n)
{
uintmax_t retv = 0U;
for (size_t i = 0; i < n; ++i)
if (t[i] == true)
retv |= 1 << i;
return retv;
}
static int is_valid(bool n)
{
return n != 0 && (n & (n - 1)) == 0;
}
bool check(bool t[N1][N2])
{
uintmax_t thash[N1];
for (size_t i = 0; i < N1; ++i)
thash[i] = hash(t[i], N2);
for (size_t i = 0; i < N1; ++i)
for (size_t j = 0; j < N1; ++j)
if (i != j && !is_valid(thash[i] & thash[j]))
return 0;
return 1;
}
但它僅適用於N1 <= sizeof(uintmax_t) * CHAR_BIT
。你知道解決它的最好方法嗎?
Oups,我想我沒有很好地解釋我的問題。我將編輯。 – md5