Неоновое сравнение
Согласно неоновой документации:
- Если сравнение истинно для линии, то результатом в этой линии являются все биты, установленные в единицу. Если сравнение для линии является ложным, все биты устанавливаются в ноль. Тип возвращаемого значения - целое число без знака.
Я написал небольшой фрагмент кода, чтобы проверить это, и я наблюдал результат как 0 и -1 вместо 0 и 1. Может кто-нибудь сказать мне причину этого?
Код:
float c1[4] = {12.0f,12.0f,12.0f,12.0f};
float c2[4] = {13.0f,12.0f,9.0f,12.0f};
float32x4_t t1,t2;
uint32x4_t rq;
t1 = vld1q_f32(c1);
t2 = vld1q_f32(c2);
rq = vceqq_f32(t1,t2);
printf("start\n");
for( int i = 0;i < 4; i++){
printf("%d\n",rq[i]);
}
printf("end\n");
Результат:
start
0
-1
0
-1
end
2 ответа
Вы отображаете значения, как будто они подписаны, потому что вы используете %d
как printf
спецификатор формата. Если вы используете %u
вы увидите эквивалентные значения без знака (0
или же UINT_MAX
).
Обратите внимание, что в этом контексте подпись не особенно важна - вы можете рассматривать результаты сравнения как маски без знака (все 0 или все 1) или как целочисленные значения со знаком (0 или -1) - это тот же базовый битовый шаблон - просто используйте все, что имеет смысл в конкретном контексте, где вы используете результат.
Здесь, согласно неоновому документу, также упоминается, что все биты будут установлены в единицу.
Вот здесь:
Binary 1111 1111 1111 1111 1111 1111 1111 1111 = Decimal 4294967295
И используйте%u вместо%d . Вы получите результат как:
Результат:
0
4294967295
0
4294967295
Вы получаете результат как -1, что означает, что все биты установлены в единицу. Это можно использовать для дальнейшей логической операции, такой как побитовая и битовая операция или операция.