/* * 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_ */