簡體   English   中英

用算術/按位運算符實現關系運算符

[英]Implement relational operator with arithmetic/bitwise operators

假設:

  • 二進制補碼形式的32位有符號整數
  • truefalse是值為10整數
  • Java運算符

可以僅使用算術和按位運算符來實現像<==這樣的關系運算符嗎?

這是一個快速嘗試。 小於號是比較麻煩的,但是如果需要,可以在32位算術中使用。

int32_t cmp_lt(int32_t lhs, int32_t rhs) {
    int64_t tmp = lhs;
    tmp -= rhs;
    tmp >>= 63;
    return tmp & 1;
}

int32_t cmp_eq(int32_t lhs, int32_t rhs) {
    return (cmp_lt(lhs, rhs) | cmp_lt(rhs, lhs)) ^ 1;
}

// 32-bit only version
int32_t cmp_lt32(int32_t lhs, int32_t rhs) {
    int32_t tmp = lhs - rhs;
    // -lhs < +rhs is always true
    tmp |= ~rhs & lhs;
    // +lhs < -rhs is always false
    tmp &= ~rhs | lhs;
    tmp >>= 31;
    return tmp & 1;
}

編輯:我看到要求Java。 不是我的母語,但我相信這里可以用int32_t和int64_t替換常規整數和long類型。

我認為小於/大於可通過以下方式實現:將另一個相減,轉換為無符號int,然后對符號位使用按位與,然后將其移至最低有效位。

可以通過對兩個數字相減的結果使用二進制NOT來實現相等。 尚未測試這些,但是幾年前在OpenCL中使用了類似的方法來防止在GPU上分支。

大於的示例:

#include <stdio.h>

int main(int argc, char** argv) {
  int x = 6;
  int y = 4;
  int diff;
  unsigned int* udiff;
  unsigned int gr;
  unsigned int one = 1;

  diff = x - y;
  udiff = (unsigned int*)&diff;
  gr = (*udiff & (one << 31)) >> 31;

  printf("%d", gr);


}

(鍵盤)

少於類似地可以做的事情。 平等:

#include <stdio.h>

int main(int argc, char** argv) {
  int x = 4;
  int y = 4;

  int diff;
  unsigned int* udiff;
  unsigned int eq;

  diff = x - y;
  udiff = (unsigned int*)&diff;

  eq = !(*udiff);

  printf("%d", eq);

}  

(鍵盤)

不確定如何在Java中執行此操作,這取決於您可以使用指針轉換將帶符號的整數值重新解釋為C中的無符號int。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM