From 7fa822fc4249d7a7c634461594a790995f3694aa Mon Sep 17 00:00:00 2001 From: Vahagn Khachatryan Date: Mon, 22 Nov 2021 11:12:39 +0000 Subject: [PATCH] negabinary.cpp --- puzzles/interviews/training/negabinary.cpp | 61 ++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 puzzles/interviews/training/negabinary.cpp diff --git a/puzzles/interviews/training/negabinary.cpp b/puzzles/interviews/training/negabinary.cpp new file mode 100644 index 0000000..322e315 --- /dev/null +++ b/puzzles/interviews/training/negabinary.cpp @@ -0,0 +1,61 @@ +/* +VIM: let b:lcppflags="-std=c++2a -O2 -pthread -I." +VIM: let b:wcppflags="/O2 /EHsc /DWIN32" +VIM-: let b:argv="" +*/ +#include +#include +#include +#include +#include + + +template +constexpr T negabinary(T v){ + static_assert(std::is_integral_v, "Only integral types expected."); + const T base = -2; + const T abs_base = abs(base); + std::make_unsigned_t n = 0; + int i = 0; + while ( v ){ + T r = v % base; + v /= base; + if ( r < 0){ + v +=1; + r = abs_base - r; + } + n |= std::make_unsigned_t(r) << i; + ++i; + } + return n; +} + + +int main ( void ) +{try{ + auto begin = std::chrono::high_resolution_clock::now(); + + + for (int i = -16; i < 17; ++i){ + std::cout << std::setbase(10) << i << " == " << std::setbase(16) << std::showbase << negabinary(i) << std::endl; + } + //std::cout << negabinary(2.) << std::endl; + + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration seconds = end - begin; + std::cout << "Time: " << seconds.count() << std::endl; + return 0; +} +catch ( const std::exception& e ) +{ + std::cerr << std::endl + << "std::exception(\"" << e.what() << "\")." << std::endl; + return 2; +} +catch ( ... ) +{ + std::cerr << std::endl + << "unknown exception." << std::endl; + return 1; +}} +