Convertir el complemento de dos en magnitud de signo

Necesito convertir el complemento de dos a la magnitud de signo en C utilizando solo los operadores

! ~ & ^ | + <> 

Mi enfoque es encontrar signo: int sign = !(!(a>>31));

Básicamente, if sign == 1 . Quiero cambiar el número y agregar 1, de lo contrario, solo quiero mostrar el número.

La cosa es que no puedo usar ningún bucle, si las declaraciones, etc. Esto es en lo que estoy trabajando:

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

¿alguna sugerencia?

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

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

Da el valor absoluto (magnitud). Si desea agregar el bit de inicio de sesión simplemente enmascarar y el bit 32nd:

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

O si estás buscando un forro único:

 unsigned int s_M = ((v + (v >> 31)) ^ (v >> 31)) | (v & 0x80000000); 

Cuando estés convirtiendo de 2 complementos, debes restar 1, no sumr.

No estoy completamente seguro de cuál debería ser la salida, pero para obtener la magnitud puede hacer algo como esto:

 int m = (a^(a>>31)) + sign; 

Básicamente, si se desplaza un número negativo de 31 bits a la derecha, se convertirá en todos los 1 o 0xffffffff , que luego puede usar para xo el número de entrada y hacerlo positivo. Como anotó correctamente, se debe agregar el sign para obtener el resultado correcto en ese caso.

Si el número de entrada fue positivo para empezar, el cambio da como resultado un cero, por lo que el xor no hace nada. Agregar sign en ese caso tampoco hace nada, por lo que resulta en el número de entrada.

Para obtener el último bit se podría utilizar la operación de máscara.

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

si es 0 simplemente muestre el número dado, de lo contrario tendrá que realizar las siguientes operaciones para representar en magnitud con signo

1) Resta 1 del número

2) realizar 1s complemento en la resultante (es decir, negación ~ )

3) Establecer el último bit del número resultante

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

desde su restringido para no usar - operador. Realiza el 2's complement on -1 y agrégalo al num .

 To put it simple in one line num & 0x80000000 ? printf("%d",(~(num+((~1)+1))) | 0x7fffffff) : printf("%d",num) ;