/* * Codec.hpp * * Created on: 21 ���. 2019 �. * Author: krugliy */ #ifndef SOURCE_COMMON_CODEC_HPP_ #define SOURCE_COMMON_CODEC_HPP_ #include #if __cplusplus > 199711L namespace std { namespace tr1 { using std::enable_if; using std::is_unsigned; } } #endif namespace codec { struct BinDecoder { template::value>::type > T operator()( T bin, unsigned short most_signed_bit_pos ) { return bin & ((1ull << most_signed_bit_pos) - 1); } }; struct InverseBinDecoder { template::value>::type > T operator()( T bin, unsigned short most_signed_bit_pos ) { return ~bin & ((1ull << most_signed_bit_pos) - 1); } }; //!�������������� � ��� ����. struct GrayCodeCoder { template::value>::type > T operator()( T bin ) { return bin ^ (bin >> 1); } }; //!�������������� �� ���� ����. struct GrayCodeDecoder { template::value>::type > T operator()( T gray_code, unsigned short most_signed_bit_pos ) { T raw_code = 0; for( ; gray_code; gray_code >>= 1 ) raw_code ^= gray_code; return raw_code; //return (~raw_code) & ((1ull << most_signed_bit_pos) - 1); //���� ����� } }; //!�������������� �� ���� ���� � ��������� ����������� �����. struct InverseGrayCodeDecoder : private GrayCodeDecoder { //!most_signed_bit_pos - ������� �������� ���� � ����. ���� ��� n-������, most_signed_bit_pos = n - 1 template::value>::type > T operator()( T gray_code, unsigned short most_signed_bit_pos ) { return GrayCodeDecoder::operator()( gray_code ^ (1 << most_signed_bit_pos), most_signed_bit_pos ); } }; } #endif /* SOURCE_COMMON_CODEC_HPP_ */