1. ホーム
  2. c++

[解決済み] シフトを使用しないTMaxの求め方

2022-02-13 11:12:02

質問

ONLYを使用する

 ! ~ & ^ | +

32ビット数がTMaxかどうかを調べるにはどうしたらいいですか?

TMaxは最大、2の補数です。

これまでの私の考えは

int isTMax(int x)
{
  int y = 0;
  x = ~x;
  y = x + x;
  return !y;
}

しかし、TMaxのプロパティでTMaxを返してくれるようなものは思いつきません。例えば、tmaxを自分自身に足すと、他のすべての整数と比較してユニークになります。


実際の問題はこちらです。

/*
 * isTMax - return 1 if x is the maximum, two's complement number,
 *     and 0 return otherwise. 
 *   Legal ops: ! ~ & ^ | +
 *   Max ops: 10
 *   Rating: 1
 */
int isTMax(int x) {
  int y = 0;
  x = ~x;
  y = x + x;

  return !y;
}

intは32ビットなので、符号付きの最大値は0x7FFFFFFでしょう。

どのように解決するのですか?

こんな感じでしょうか? 0x7FFFFFFF は正符号付き 32 ビット 2 の補数の最大値です。

int isTMax(int x){
    return !(x ^ 0x7FFFFFFF);
}

よくわからないのですが、unsignedにキャストしないと動作しないかもしれません。