#include <stdio.h>
#include <limits.h>
#include <string.h>
int DivByShifting2(int n, unsigned shift)
{
unsigned un = n;
unsigned sgn = 1 + ~(un >> ((sizeof(int) * CHAR_BIT) - 1));
un = ((((un + sgn) ^ sgn) >> shift) + sgn) ^ sgn;
return n;
}
int main(void)
{
int n, s;
for (n = -10; n <= 10; n++)
for (s = 0; s <= 4; s++)
printf("%d / %d = %d\n", n
, 1 << s
, DivByShifting2
(n
, s
)); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKaW50IERpdkJ5U2hpZnRpbmcyKGludCBuLCB1bnNpZ25lZCBzaGlmdCkKewogIHVuc2lnbmVkIHVuID0gbjsKICB1bnNpZ25lZCBzZ24gPSAxICsgfih1biA+PiAoKHNpemVvZihpbnQpICogQ0hBUl9CSVQpIC0gMSkpOwogIHVuID0gKCgoKHVuICsgc2duKSBeIHNnbikgPj4gc2hpZnQpICsgc2duKSBeIHNnbjsKICBtZW1jcHkoJm4sICZ1biwgc2l6ZW9mIG4pOwogIHJldHVybiBuOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgaW50IG4sIHM7CiAgZm9yIChuID0gLTEwOyBuIDw9IDEwOyBuKyspCiAgICBmb3IgKHMgPSAwOyBzIDw9IDQ7IHMrKykKICAgICAgcHJpbnRmKCIlZCAvICVkID0gJWRcbiIsIG4sIDEgPDwgcywgRGl2QnlTaGlmdGluZzIobiwgcykpOwogIHJldHVybiAwOwp9Cg==