Random-Cpp/NegBin/NegBin.h

57 lines
1.7 KiB
C++

//
// Created by trotfunky on 04/11/2020.
//
#ifndef MISC_NEGBIN_H
#define MISC_NEGBIN_H
#include <cmath>
#include <bitset>
/// Bitset the size of a long, for convenience
typedef std::bitset<sizeof(long)*8> longBitField;
/***
* Represents a number in base negative two.
* For ex. : 0b1 is 1, 0b10 is -2, 0b1010 is 6.
*/
class NegBin {
public:
NegBin() = default;
/// Create a NegBin with a specific binary representation
explicit NegBin(longBitField binaryRepresentation);
/// Converts from long to NegBin. For ex 3 would set value to 0b111
explicit NegBin(long number);
NegBin& operator+=(const NegBin& rhs);
// Uses += and ~ to do a subtraction
NegBin& operator-=(const NegBin& rhs);
NegBin& operator*=(const int& rhs);
/// Used to obtain the binary representation of value's opposite
NegBin operator~() const;
/// Shifts the underlying binary representation
NegBin operator>>(const int& rhs);
NegBin operator<<(const int& rhs);
friend NegBin operator+(NegBin lhs, const NegBin& rhs);
friend NegBin operator-(NegBin lhs, const NegBin& rhs);
// Doubled, for symmetry
friend NegBin operator*(NegBin lhs, const int& rhs);
friend NegBin operator*(const int& lhs, NegBin rhs);
/// Converts from NegBin to signed long, converting to unsigned would not make sense
explicit operator long() const;
private:
/// Binary description of the number.
unsigned long value; // TODO : Maybe use bitset everywhere ?
};
/// Define literal to create NegBin numbers. Calls the NegBin::NegBin(longBitField) constructor
NegBin operator "" _nb(unsigned long long);
std::ostream& operator<<(std::ostream& ostream, const NegBin& number);
#endif //MISC_NEGBIN_H