50 lines
1.1 KiB
C
50 lines
1.1 KiB
C
|
uint64_t dot_product(char* A, char* B, char** out, int32_t size)
|
||
|
{
|
||
|
if (A == NULL || B == NULL)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
int32_t res = 1;
|
||
|
int64_t i = 0;
|
||
|
int32_t j = 0;
|
||
|
|
||
|
*out = calloc(size * size, 1);
|
||
|
|
||
|
while (size > j)
|
||
|
{
|
||
|
int64_t k = 0;
|
||
|
char* A_line = A + i;
|
||
|
do
|
||
|
{
|
||
|
char* B_col = B + k;
|
||
|
int64_t col = 0;
|
||
|
int32_t sum = 0;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
char element;
|
||
|
element = A_line[col];
|
||
|
element *= B_col[0];
|
||
|
col += 1;
|
||
|
B_col += size;
|
||
|
sum += element;
|
||
|
} while (size > col);
|
||
|
|
||
|
((*out) + i)[k] = sum; // ith line, kth column
|
||
|
|
||
|
bool win;
|
||
|
if (j != k) // Check if on the diagonal
|
||
|
win = sum == 0; // if not check that it is 0
|
||
|
else
|
||
|
win = sum == 1; // if yes check it is 1
|
||
|
|
||
|
k += 1;
|
||
|
res &= win; // Bitwise and, every number must be correct
|
||
|
} while (size > k);
|
||
|
|
||
|
j += 1;
|
||
|
i += size;
|
||
|
}
|
||
|
return res;
|
||
|
}
|