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