fork download
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <assert.h>
  4.  
  5. // return x*2^p for p = -31..31
  6. int32_t shiftS32(int32_t x, int32_t p)
  7. {
  8. return (p >= 0) ? (x << p) :
  9. ((int32_t)(x + ((uint32_t)(-(x < 0)) >> (p + 32))) >> -p);
  10. }
  11.  
  12. int main(void)
  13. {
  14. for (int32_t x = -10; x < 10; x++)
  15. for (int32_t p = -4; p <= 4; p++)
  16. {
  17. int32_t r = shiftS32(x, p);
  18. printf("shiftS32(%ld, %ld) = %ld\n", (long)x, (long)p, (long)r);
  19. if (p < 0)
  20. {
  21. if (x >= 0) { assert(r == (x >> -p)); }
  22. else { assert(r == -(-x >> -p)); }
  23. }
  24. }
  25. return 0;
  26. }
  27.  
Success #stdin #stdout 0s 9424KB
stdin
Standard input is empty
stdout
shiftS32(-10, -4) = 0
shiftS32(-10, -3) = -1
shiftS32(-10, -2) = -2
shiftS32(-10, -1) = -5
shiftS32(-10, 0) = -10
shiftS32(-10, 1) = -20
shiftS32(-10, 2) = -40
shiftS32(-10, 3) = -80
shiftS32(-10, 4) = -160
shiftS32(-9, -4) = 0
shiftS32(-9, -3) = -1
shiftS32(-9, -2) = -2
shiftS32(-9, -1) = -4
shiftS32(-9, 0) = -9
shiftS32(-9, 1) = -18
shiftS32(-9, 2) = -36
shiftS32(-9, 3) = -72
shiftS32(-9, 4) = -144
shiftS32(-8, -4) = 0
shiftS32(-8, -3) = -1
shiftS32(-8, -2) = -2
shiftS32(-8, -1) = -4
shiftS32(-8, 0) = -8
shiftS32(-8, 1) = -16
shiftS32(-8, 2) = -32
shiftS32(-8, 3) = -64
shiftS32(-8, 4) = -128
shiftS32(-7, -4) = 0
shiftS32(-7, -3) = 0
shiftS32(-7, -2) = -1
shiftS32(-7, -1) = -3
shiftS32(-7, 0) = -7
shiftS32(-7, 1) = -14
shiftS32(-7, 2) = -28
shiftS32(-7, 3) = -56
shiftS32(-7, 4) = -112
shiftS32(-6, -4) = 0
shiftS32(-6, -3) = 0
shiftS32(-6, -2) = -1
shiftS32(-6, -1) = -3
shiftS32(-6, 0) = -6
shiftS32(-6, 1) = -12
shiftS32(-6, 2) = -24
shiftS32(-6, 3) = -48
shiftS32(-6, 4) = -96
shiftS32(-5, -4) = 0
shiftS32(-5, -3) = 0
shiftS32(-5, -2) = -1
shiftS32(-5, -1) = -2
shiftS32(-5, 0) = -5
shiftS32(-5, 1) = -10
shiftS32(-5, 2) = -20
shiftS32(-5, 3) = -40
shiftS32(-5, 4) = -80
shiftS32(-4, -4) = 0
shiftS32(-4, -3) = 0
shiftS32(-4, -2) = -1
shiftS32(-4, -1) = -2
shiftS32(-4, 0) = -4
shiftS32(-4, 1) = -8
shiftS32(-4, 2) = -16
shiftS32(-4, 3) = -32
shiftS32(-4, 4) = -64
shiftS32(-3, -4) = 0
shiftS32(-3, -3) = 0
shiftS32(-3, -2) = 0
shiftS32(-3, -1) = -1
shiftS32(-3, 0) = -3
shiftS32(-3, 1) = -6
shiftS32(-3, 2) = -12
shiftS32(-3, 3) = -24
shiftS32(-3, 4) = -48
shiftS32(-2, -4) = 0
shiftS32(-2, -3) = 0
shiftS32(-2, -2) = 0
shiftS32(-2, -1) = -1
shiftS32(-2, 0) = -2
shiftS32(-2, 1) = -4
shiftS32(-2, 2) = -8
shiftS32(-2, 3) = -16
shiftS32(-2, 4) = -32
shiftS32(-1, -4) = 0
shiftS32(-1, -3) = 0
shiftS32(-1, -2) = 0
shiftS32(-1, -1) = 0
shiftS32(-1, 0) = -1
shiftS32(-1, 1) = -2
shiftS32(-1, 2) = -4
shiftS32(-1, 3) = -8
shiftS32(-1, 4) = -16
shiftS32(0, -4) = 0
shiftS32(0, -3) = 0
shiftS32(0, -2) = 0
shiftS32(0, -1) = 0
shiftS32(0, 0) = 0
shiftS32(0, 1) = 0
shiftS32(0, 2) = 0
shiftS32(0, 3) = 0
shiftS32(0, 4) = 0
shiftS32(1, -4) = 0
shiftS32(1, -3) = 0
shiftS32(1, -2) = 0
shiftS32(1, -1) = 0
shiftS32(1, 0) = 1
shiftS32(1, 1) = 2
shiftS32(1, 2) = 4
shiftS32(1, 3) = 8
shiftS32(1, 4) = 16
shiftS32(2, -4) = 0
shiftS32(2, -3) = 0
shiftS32(2, -2) = 0
shiftS32(2, -1) = 1
shiftS32(2, 0) = 2
shiftS32(2, 1) = 4
shiftS32(2, 2) = 8
shiftS32(2, 3) = 16
shiftS32(2, 4) = 32
shiftS32(3, -4) = 0
shiftS32(3, -3) = 0
shiftS32(3, -2) = 0
shiftS32(3, -1) = 1
shiftS32(3, 0) = 3
shiftS32(3, 1) = 6
shiftS32(3, 2) = 12
shiftS32(3, 3) = 24
shiftS32(3, 4) = 48
shiftS32(4, -4) = 0
shiftS32(4, -3) = 0
shiftS32(4, -2) = 1
shiftS32(4, -1) = 2
shiftS32(4, 0) = 4
shiftS32(4, 1) = 8
shiftS32(4, 2) = 16
shiftS32(4, 3) = 32
shiftS32(4, 4) = 64
shiftS32(5, -4) = 0
shiftS32(5, -3) = 0
shiftS32(5, -2) = 1
shiftS32(5, -1) = 2
shiftS32(5, 0) = 5
shiftS32(5, 1) = 10
shiftS32(5, 2) = 20
shiftS32(5, 3) = 40
shiftS32(5, 4) = 80
shiftS32(6, -4) = 0
shiftS32(6, -3) = 0
shiftS32(6, -2) = 1
shiftS32(6, -1) = 3
shiftS32(6, 0) = 6
shiftS32(6, 1) = 12
shiftS32(6, 2) = 24
shiftS32(6, 3) = 48
shiftS32(6, 4) = 96
shiftS32(7, -4) = 0
shiftS32(7, -3) = 0
shiftS32(7, -2) = 1
shiftS32(7, -1) = 3
shiftS32(7, 0) = 7
shiftS32(7, 1) = 14
shiftS32(7, 2) = 28
shiftS32(7, 3) = 56
shiftS32(7, 4) = 112
shiftS32(8, -4) = 0
shiftS32(8, -3) = 1
shiftS32(8, -2) = 2
shiftS32(8, -1) = 4
shiftS32(8, 0) = 8
shiftS32(8, 1) = 16
shiftS32(8, 2) = 32
shiftS32(8, 3) = 64
shiftS32(8, 4) = 128
shiftS32(9, -4) = 0
shiftS32(9, -3) = 1
shiftS32(9, -2) = 2
shiftS32(9, -1) = 4
shiftS32(9, 0) = 9
shiftS32(9, 1) = 18
shiftS32(9, 2) = 36
shiftS32(9, 3) = 72
shiftS32(9, 4) = 144