| #include "f2c.h" |
| |
| #ifndef LONGBITS |
| #define LONGBITS 32 |
| #endif |
| |
| #ifndef LONG8BITS |
| #define LONG8BITS (2*LONGBITS) |
| #endif |
| |
| integer |
| qbit_bits (longint a, integer b, integer len) |
| { |
| /* Assume 2's complement arithmetic */ |
| |
| ulongint x, y; |
| |
| x = (ulongint) a; |
| y = (ulongint) - 1L; |
| x >>= b; |
| y <<= len; |
| return (longint) (x & y); |
| } |
| |
| longint |
| qbit_cshift (longint a, integer b, integer len) |
| { |
| ulongint x, y, z; |
| |
| x = (ulongint) a; |
| if (len <= 0) |
| { |
| if (len == 0) |
| return 0; |
| goto full_len; |
| } |
| if (len >= LONG8BITS) |
| { |
| full_len: |
| if (b >= 0) |
| { |
| b %= LONG8BITS; |
| return (longint) (x << b | x >> (LONG8BITS - b)); |
| } |
| b = -b; |
| b %= LONG8BITS; |
| return (longint) (x << (LONG8BITS - b) | x >> b); |
| } |
| y = z = (unsigned long) -1; |
| y <<= len; |
| z &= ~y; |
| y &= x; |
| x &= z; |
| if (b >= 0) |
| { |
| b %= len; |
| return (longint) (y | (z & (x << b | x >> (len - b)))); |
| } |
| b = -b; |
| b %= len; |
| return (longint) (y | (z & (x >> b | x << (len - b)))); |
| } |