Clearmatics Libff  0.1
C++ library for Finite Fields and Elliptic Curves
utils.cpp
Go to the documentation of this file.
1 
10 #include <algorithm>
11 #include <cassert>
12 #include <cstdarg>
13 #include <cstdint>
14 #include <libff/common/utils.hpp>
15 
16 namespace libff
17 {
18 
19 size_t get_power_of_two(size_t n)
20 {
21  n--;
22  n |= n >> 1;
23  n |= n >> 2;
24  n |= n >> 4;
25  n |= n >> 8;
26  n |= n >> 16;
27  n++;
28 
29  return n;
30 }
31 
32 size_t log2(size_t n)
33 /* returns ceil(log2(n)), so 1ul<<log2(n) is the smallest power of 2,
34  that is not less than n. */
35 {
36  size_t r = ((n & (n - 1)) == 0 ? 0 : 1); // add 1 if n is not power of 2
37 
38  while (n > 1) {
39  n >>= 1;
40  r++;
41  }
42 
43  return r;
44 }
45 
46 size_t to_twos_complement(int i, size_t w)
47 {
48  assert(i >= -(1l << (w - 1)));
49  assert(i < (1l << (w - 1)));
50  return (i >= 0) ? i : i + (1l << w);
51 }
52 
53 int from_twos_complement(size_t i, size_t w)
54 {
55  assert(i < (1ul << w));
56  return (i < (1ul << (w - 1))) ? i : i - (1ul << w);
57 }
58 
59 size_t bitreverse(size_t n, const size_t l)
60 {
61  size_t r = 0;
62  for (size_t k = 0; k < l; ++k) {
63  r = (r << 1) | (n & 1);
64  n >>= 1;
65  }
66  return r;
67 }
68 
70  const std::initializer_list<unsigned long> &l, const size_t wordsize)
71 {
72  bit_vector res(wordsize * l.size());
73  for (size_t i = 0; i < l.size(); ++i) {
74  for (size_t j = 0; j < wordsize; ++j) {
75  res[i * wordsize + j] =
76  (*(l.begin() + i) & (1ul << (wordsize - 1 - j)));
77  }
78  }
79  return res;
80 }
81 
82 long long div_ceil(long long x, long long y) { return (x + (y - 1)) / y; }
83 
85 {
86  uint64_t a = 0x12345678;
87  unsigned char *c = (unsigned char *)(&a);
88  return (*c = 0x78);
89 }
90 
91 std::string FORMAT(const std::string &prefix, const char *format, ...)
92 {
93  const static size_t MAX_FMT = 256;
94  char buf[MAX_FMT];
95  va_list args;
96  va_start(args, format);
97  vsnprintf(buf, MAX_FMT, format, args);
98  va_end(args);
99 
100  return prefix + std::string(buf);
101 }
102 
103 void serialize_bit_vector(std::ostream &out, const bit_vector &v)
104 {
105  out << v.size() << "\n";
106  for (size_t i = 0; i < v.size(); ++i) {
107  out << v[i] << "\n";
108  }
109 }
110 
111 void deserialize_bit_vector(std::istream &in, bit_vector &v)
112 {
113  size_t size;
114  in >> size;
115  v.resize(size);
116  for (size_t i = 0; i < size; ++i) {
117  bool b;
118  in >> b;
119  v[i] = b;
120  }
121 }
122 } // namespace libff
libff::get_power_of_two
size_t get_power_of_two(size_t n)
Definition: utils.cpp:19
utils.hpp
libff
Definition: ffi.cpp:8
libff::div_ceil
long long div_ceil(long long x, long long y)
Definition: utils.cpp:82
libff::int_list_to_bits
bit_vector int_list_to_bits(const std::initializer_list< unsigned long > &l, const size_t wordsize)
Definition: utils.cpp:69
libff::bit_vector
std::vector< bool > bit_vector
Definition: utils.hpp:22
libff::bitreverse
size_t bitreverse(size_t n, const size_t l)
Definition: utils.cpp:59
libff::serialize_bit_vector
void serialize_bit_vector(std::ostream &out, const bit_vector &v)
Definition: utils.cpp:103
libff::is_little_endian
bool is_little_endian()
Definition: utils.cpp:84
libff::log2
size_t log2(size_t n)
Definition: utils.cpp:32
libff::to_twos_complement
size_t to_twos_complement(int i, size_t w)
Definition: utils.cpp:46
libff::FORMAT
std::string FORMAT(const std::string &prefix, const char *format,...)
Definition: utils.cpp:91
libff::from_twos_complement
int from_twos_complement(size_t i, size_t w)
Definition: utils.cpp:53
libff::deserialize_bit_vector
void deserialize_bit_vector(std::istream &in, bit_vector &v)
Definition: utils.cpp:111