1 // 2 // readstat_bits.c - Bit-twiddling utility functions 3 // 4 5 #include <sys/types.h> 6 #include <stdint.h> 7 #include <string.h> 8 9 #include "readstat_bits.h" 10 machine_is_little_endian()11int machine_is_little_endian() { 12 int test_byte_order = 1; 13 return ((char *)&test_byte_order)[0]; 14 } 15 ones_to_twos_complement1(char num)16char ones_to_twos_complement1(char num) { 17 return num < 0 ? num+1 : num; 18 } 19 ones_to_twos_complement2(int16_t num)20int16_t ones_to_twos_complement2(int16_t num) { 21 return num < 0 ? num+1 : num; 22 } 23 ones_to_twos_complement4(int32_t num)24int32_t ones_to_twos_complement4(int32_t num) { 25 return num < 0 ? num+1 : num; 26 } 27 twos_to_ones_complement1(char num)28char twos_to_ones_complement1(char num) { 29 return num < 0 ? num-1 : num; 30 } 31 twos_to_ones_complement2(int16_t num)32int16_t twos_to_ones_complement2(int16_t num) { 33 return num < 0 ? num-1 : num; 34 } 35 twos_to_ones_complement4(int32_t num)36int32_t twos_to_ones_complement4(int32_t num) { 37 return num < 0 ? num-1 : num; 38 } 39 byteswap2(uint16_t num)40uint16_t byteswap2(uint16_t num) { 41 return ((num & 0xFF00) >> 8) | ((num & 0x00FF) << 8); 42 } 43 byteswap4(uint32_t num)44uint32_t byteswap4(uint32_t num) { 45 num = ((num & 0xFFFF0000) >> 16) | ((num & 0x0000FFFF) << 16); 46 return ((num & 0xFF00FF00) >> 8) | ((num & 0x00FF00FF) << 8); 47 } 48 byteswap8(uint64_t num)49uint64_t byteswap8(uint64_t num) { 50 num = ((num & 0xFFFFFFFF00000000) >> 32) | ((num & 0x00000000FFFFFFFF) << 32); 51 num = ((num & 0xFFFF0000FFFF0000) >> 16) | ((num & 0x0000FFFF0000FFFF) << 16); 52 return ((num & 0xFF00FF00FF00FF00) >> 8) | ((num & 0x00FF00FF00FF00FF) << 8); 53 } 54 byteswap_float(float num)55float byteswap_float(float num) { 56 uint32_t answer = 0; 57 memcpy(&answer, &num, 4); 58 answer = byteswap4(answer); 59 memcpy(&num, &answer, 4); 60 return num; 61 } 62 byteswap_double(double num)63double byteswap_double(double num) { 64 uint64_t answer = 0; 65 memcpy(&answer, &num, 8); 66 answer = byteswap8(answer); 67 memcpy(&num, &answer, 8); 68 return num; 69 } 70