簡體   English   中英

編譯時帶符號移位運算符

[英]Compile Time Signed Shift Operator

這是一個宏,因此我討厭它,但是它對我想要的東西是“有效的”:

#define signed_shift(val,shift) ((shift) < 0 ? (val) >> -(shift) : (val) << (shift))

它需要是編譯時間(constexpr將在C ++ 11中工作,但我陷在c ++ 98中)。

任何人都有更好的方法(助推器可以)。

template <int val, int shift>
struct signed_shift
{
    static const int result = (shift < 0) ? (val >> -shift) : (val << shift);
};

int main()
{
    BOOST_STATIC_ASSERT(signed_shift<4, 3>::result == 32);
    BOOST_STATIC_ASSERT(signed_shift<4, 0>::result == 4);
    BOOST_STATIC_ASSERT(signed_shift<4, -1>::result == 2);
}

這可以通過模板來完成(由於C ++ 03不支持靜態成員的類內初始化,所以靜態成員是類外的):

#include <iostream>

template<typename T, T val, T shift>
struct signed_shift {
    static T const value;
};

template<typename T, T val, T shift>
T const signed_shift<T,val,shift>::value
    = ((shift) < 0 ? val >> -shift : val << shift);

int main()
{
    std::cout << signed_shift<int, 1, 3>::value << '\n';
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM