int32 это фиксированная длинна слова, биты "пронумерованы" без связи с порядком байтов - "промахнуться" тяжело (:)) даже на другой архитектуре. Затираем самый старший бит(собственно знак) и вуаля. ... А приведенные Вами (uvelichitel) примеры - рабочие, как neolink уже показал.
На irc #go-nuts сказали что знак точно в верхнем бите. Подскажите как к нему bitwise добраться.
Так то оно так, но код то отрицательных чисел
дополнительный до 2-x... потому мы выделяем маской старший бит и хитро пляшем с бубном еще и потому что в go нет побитового отрицания(!)
а вообще влоб нужно
Для получения из дополнительного кода самого числа....
#include <stdlib.h>
#include <unistd.h>
int i32abs4training(int x)
{
int m;
m = 2*((x >> 31)&1) - 1; // negative or positive (invers)
// printf("bits in a integer word %i\n", sizeof(x)*8);
return ~(m*x) + 1;
}
int main()
{
printf ("%i\n", i32abs4training(-12));
printf ("%i\n", i32abs4training(12));
printf ("%i\n", i32abs4training(14));
printf ("%i\n", i32abs4training(-32768));
}
Приведенный код не претендует на быстродействие - это просто показать из чего вывели "быстрый" подход и для golang, и для C и для asm.