(기록용) C++ 0부터 (2^n-1) 까지의 정수 이진수 출력

이경헌·2023년 10월 20일
0
#include <range/v3/view/cartesian_product.hpp>
#include <range/v3/view/transform.hpp>
#include <range/v3/view/enumerate.hpp>

import std;

#define FWD(x) std::forward<decltype(x)>(x)
#define INDEX_SEQUENCE(Is, N, Expression) [&]<std::size_t... Is>(std::index_sequence<Is...>){ Expression }(std::make_index_sequence<N>{})

template <std::size_t N>
void binary1(){
    static constexpr std::array bit { '0', '1' };

#pragma clang diagnostic ignored "-Wunused-value"
    auto binaries = INDEX_SEQUENCE(Is, N, return ranges::views::cartesian_product((Is, bit)... /* cause of -Wunused-value warning */); )
        | ranges::views::transform([](auto &&bit_tuple) {
            return INDEX_SEQUENCE(Is, N, return std::string { ranges::get<Is>(bit_tuple)... }; );
        })
        | ranges::views::enumerate;

    for (auto &&[n, binary] : binaries){
        std::println("{} = 0b{}", n, binary);
    }
}

template <std::size_t N>
void binary2(){
    auto binaries = std::views::iota(0UZ, 1UZ << N)
        | std::views::transform([](std::size_t n){
            auto binary = INDEX_SEQUENCE(Is, N, return std::string { ((n >> (N - Is - 1UZ)) & 1UZ ? '1' : '0')... }; );
            return std::make_pair(n, binary);
        });

    for (auto &&[n, binary] : binaries){
        std::println("{} = 0b{}", n, binary);
    }
}

template <std::size_t N>
void binary3(){
    for (std::size_t n : std::views::iota(0UZ, 1UZ << N)){
        std::println("{0} = 0b{0:0>{1}b}", n, N);
    }
}

int main() {
    constexpr std::size_t N = 4;

    binary1<N>();
    binary2<N>();
    binary3<N>();
}

Compiler: Clang 17
External libraries: range-v3

profile
Undergraduate student in Korea University. Major in electrical engineering and computer science.

0개의 댓글