0

演算子のみを使用して、C で 2 の補数から符号の大きさに変換する必要があります

! ~ & ^ | + << >>

私のアプローチは、サインを見つけることです: int sign = !(!(a>>31));

基本的に、if sign == 1。数字を反転して1を追加したいのですが、それ以外は数字を表示したいだけです。

問題は、ifステートメントなどのループを使用できないことです。これは私が取り組んでいるものです:

int s_M = ((((a+1)>>31)^sign)+1)&sign;

助言がありますか?

4

4 に答える 4

2

http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbsから

int const mask = v >> 31;
unsigned int r = (v + mask) ^ mask;

絶対値 (マグニチュード) を与えます。符号ビットを元に戻したい場合は、32 番目のビットを単純にマスクします。

unsigned int s_M = r | (v & 0x80000000);

または、ワンライナーを探している場合:

unsigned int s_M = ((v + (v >> 31)) ^ (v >> 31)) | (v & 0x80000000);
于 2013-10-30T19:14:32.260 に答える
0

最後のビットを取得するには、マスク操作を使用できます

   int last_bit = 32 bit integer & 0x80000000 
   o/p  may be 0 or 0x80000000    

指定された数値を表示するだけの場合は0、符号付きマグニチュードで表すために次の操作を実行する必要があります

1)数から 1 を引く

2)結果に対して 1 の補数を実行する (つまり、否定~)

3)結果の数値の最後のビットを設定します

 I mean  ( ~ (num -`1) ) | 0x7fffffff 

-演算子を使用しないように制限されているためです。を実行し、2's complement on -1に追加しnumます。

To put it simple in one line
 num & 0x80000000 ? printf("%d",(~(num+((~1)+1))) | 0x7fffffff) : printf("%d",num)   ;
于 2013-10-30T18:05:36.260 に答える
0

2 の補数から変換する場合は、足すのではなく、1 を引く必要があります。

于 2013-10-30T17:50:12.780 に答える