add single and range bitwise operations

This commit is contained in:
bolero-MURAKAMI 2014-04-05 10:27:27 +09:00
parent 5bfb5087ac
commit fd608b74e2
13 changed files with 318 additions and 2 deletions

28
sprout/bit/flipbit.hpp Normal file
View file

@ -0,0 +1,28 @@
/*=============================================================================
Copyright (c) 2011-2014 Bolero MURAKAMI
https://github.com/bolero-MURAKAMI/Sprout
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#ifndef SPROUT_BIT_FLIPBIT_HPP
#define SPROUT_BIT_FLIPBIT_HPP
#include <type_traits>
#include <sprout/config.hpp>
namespace sprout {
//
// flipbit
//
template<typename Integral>
inline SPROUT_CONSTEXPR typename std::enable_if<
std::is_integral<Integral>::value,
Integral
>::type
flipbit(Integral x, int b) SPROUT_NOEXCEPT {
return x ^ (Integral(1) << b);
}
} // namespace sprout
#endif // #ifndef SPROUT_BIT_FLIPBIT_HPP

28
sprout/bit/flipbitsge.hpp Normal file
View file

@ -0,0 +1,28 @@
/*=============================================================================
Copyright (c) 2011-2014 Bolero MURAKAMI
https://github.com/bolero-MURAKAMI/Sprout
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#ifndef SPROUT_BIT_FLIPBITSGE_HPP
#define SPROUT_BIT_FLIPBITSGE_HPP
#include <type_traits>
#include <sprout/config.hpp>
namespace sprout {
//
// flipbitsge
//
template<typename Integral>
inline SPROUT_CONSTEXPR typename std::enable_if<
std::is_integral<Integral>::value,
Integral
>::type
flipbitsge(Integral x, int b) SPROUT_NOEXCEPT {
return x ^ ~((Integral(1) << b)-1);
}
} // namespace sprout
#endif // #ifndef SPROUT_BIT_FLIPBITSGE_HPP

28
sprout/bit/flipbitsle.hpp Normal file
View file

@ -0,0 +1,28 @@
/*=============================================================================
Copyright (c) 2011-2014 Bolero MURAKAMI
https://github.com/bolero-MURAKAMI/Sprout
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#ifndef SPROUT_BIT_FLIPBITSLE_HPP
#define SPROUT_BIT_FLIPBITSLE_HPP
#include <type_traits>
#include <sprout/config.hpp>
namespace sprout {
//
// flipbitsle
//
template<typename Integral>
inline SPROUT_CONSTEXPR typename std::enable_if<
std::is_integral<Integral>::value,
Integral
>::type
flipbitsle(Integral x, int b) SPROUT_NOEXCEPT {
return x ^ ((Integral(1) << (b+1))-1);
}
} // namespace sprout
#endif // #ifndef SPROUT_BIT_FLIPBITSLE_HPP

View file

@ -13,8 +13,8 @@
#include <sprout/bit/count.hpp> #include <sprout/bit/count.hpp>
#include <sprout/bit/rightmost.hpp> #include <sprout/bit/rightmost.hpp>
#include <sprout/bit/reverse.hpp> #include <sprout/bit/reverse.hpp>
//#include <sprout/bit/single.hpp> #include <sprout/bit/single.hpp>
//#include <sprout/bit/range.hpp> #include <sprout/bit/range.hpp>
//#include <sprout/bit/pow2.hpp> //#include <sprout/bit/pow2.hpp>
//#include <sprout/bit/saturated.hpp> //#include <sprout/bit/saturated.hpp>
//#include <sprout/bit/align.hpp> //#include <sprout/bit/align.hpp>

19
sprout/bit/range.hpp Normal file
View file

@ -0,0 +1,19 @@
/*=============================================================================
Copyright (c) 2011-2014 Bolero MURAKAMI
https://github.com/bolero-MURAKAMI/Sprout
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#ifndef SPROUT_BIT_RANGE_HPP
#define SPROUT_BIT_RANGE_HPP
#include <sprout/config.hpp>
#include <sprout/bit/rstbitsge.hpp>
#include <sprout/bit/rstbitsle.hpp>
#include <sprout/bit/setbitsge.hpp>
#include <sprout/bit/setbitsle.hpp>
#include <sprout/bit/flipbitsge.hpp>
#include <sprout/bit/flipbitsle.hpp>
#endif // #ifndef SPROUT_BIT_RANGE_HPP

28
sprout/bit/rstbit.hpp Normal file
View file

@ -0,0 +1,28 @@
/*=============================================================================
Copyright (c) 2011-2014 Bolero MURAKAMI
https://github.com/bolero-MURAKAMI/Sprout
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#ifndef SPROUT_BIT_RSTBIT_HPP
#define SPROUT_BIT_RSTBIT_HPP
#include <type_traits>
#include <sprout/config.hpp>
namespace sprout {
//
// rstbit
//
template<typename Integral>
inline SPROUT_CONSTEXPR typename std::enable_if<
std::is_integral<Integral>::value,
Integral
>::type
rstbit(Integral x, int b) SPROUT_NOEXCEPT {
return x & ~(Integral(1) << b);
}
} // namespace sprout
#endif // #ifndef SPROUT_BIT_RSTBIT_HPP

28
sprout/bit/rstbitsge.hpp Normal file
View file

@ -0,0 +1,28 @@
/*=============================================================================
Copyright (c) 2011-2014 Bolero MURAKAMI
https://github.com/bolero-MURAKAMI/Sprout
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#ifndef SPROUT_BIT_RSTBITSGE_HPP
#define SPROUT_BIT_RSTBITSGE_HPP
#include <type_traits>
#include <sprout/config.hpp>
namespace sprout {
//
// rstbitsge
//
template<typename Integral>
inline SPROUT_CONSTEXPR typename std::enable_if<
std::is_integral<Integral>::value,
Integral
>::type
rstbitsge(Integral x, int b) SPROUT_NOEXCEPT {
return x & ((Integral(1) << b)-1);
}
} // namespace sprout
#endif // #ifndef SPROUT_BIT_RSTBITSGE_HPP

28
sprout/bit/rstbitsle.hpp Normal file
View file

@ -0,0 +1,28 @@
/*=============================================================================
Copyright (c) 2011-2014 Bolero MURAKAMI
https://github.com/bolero-MURAKAMI/Sprout
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#ifndef SPROUT_BIT_SRSTBITSLE_HPP
#define SPROUT_BIT_SRSTBITSLE_HPP
#include <type_traits>
#include <sprout/config.hpp>
namespace sprout {
//
// rstbitsle
//
template<typename Integral>
inline SPROUT_CONSTEXPR typename std::enable_if<
std::is_integral<Integral>::value,
Integral
>::type
rstbitsle(Integral x, int b) SPROUT_NOEXCEPT {
return x & ~((Integral(1) << (b+1))-1);
}
} // namespace sprout
#endif // #ifndef SPROUT_BIT_SRSTBITSLE_HPP

28
sprout/bit/setbit.hpp Normal file
View file

@ -0,0 +1,28 @@
/*=============================================================================
Copyright (c) 2011-2014 Bolero MURAKAMI
https://github.com/bolero-MURAKAMI/Sprout
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#ifndef SPROUT_BIT_SETBIT_HPP
#define SPROUT_BIT_SETBIT_HPP
#include <type_traits>
#include <sprout/config.hpp>
namespace sprout {
//
// setbit
//
template<typename Integral>
inline SPROUT_CONSTEXPR typename std::enable_if<
std::is_integral<Integral>::value,
Integral
>::type
setbit(Integral x, int b) SPROUT_NOEXCEPT {
return x | (Integral(1) << b);
}
} // namespace sprout
#endif // #ifndef SPROUT_BIT_SETBIT_HPP

28
sprout/bit/setbitsge.hpp Normal file
View file

@ -0,0 +1,28 @@
/*=============================================================================
Copyright (c) 2011-2014 Bolero MURAKAMI
https://github.com/bolero-MURAKAMI/Sprout
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#ifndef SPROUT_BIT_SETBITSGE_HPP
#define SPROUT_BIT_SETBITSGE_HPP
#include <type_traits>
#include <sprout/config.hpp>
namespace sprout {
//
// setbitsge
//
template<typename Integral>
inline SPROUT_CONSTEXPR typename std::enable_if<
std::is_integral<Integral>::value,
Integral
>::type
setbitsge(Integral x, int b) SPROUT_NOEXCEPT {
return x | ~((Integral(1) << b)-1);
}
} // namespace sprout
#endif // #ifndef SPROUT_BIT_SETBITSGE_HPP

28
sprout/bit/setbitsle.hpp Normal file
View file

@ -0,0 +1,28 @@
/*=============================================================================
Copyright (c) 2011-2014 Bolero MURAKAMI
https://github.com/bolero-MURAKAMI/Sprout
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#ifndef SPROUT_BIT_SETBITSLE_HPP
#define SPROUT_BIT_SETBITSLE_HPP
#include <type_traits>
#include <sprout/config.hpp>
namespace sprout {
//
// setbitsle
//
template<typename Integral>
inline SPROUT_CONSTEXPR typename std::enable_if<
std::is_integral<Integral>::value,
Integral
>::type
setbitsle(Integral x, int b) SPROUT_NOEXCEPT {
return x | ((Integral(1) << (b+1))-1);
}
} // namespace sprout
#endif // #ifndef SPROUT_BIT_SETBITSLE_HPP

17
sprout/bit/single.hpp Normal file
View file

@ -0,0 +1,17 @@
/*=============================================================================
Copyright (c) 2011-2014 Bolero MURAKAMI
https://github.com/bolero-MURAKAMI/Sprout
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#ifndef SPROUT_BIT_SINGLE_HPP
#define SPROUT_BIT_SINGLE_HPP
#include <sprout/config.hpp>
#include <sprout/bit/setbit.hpp>
#include <sprout/bit/rstbit.hpp>
#include <sprout/bit/flipbit.hpp>
#include <sprout/bit/testbit.hpp>
#endif // #ifndef SPROUT_BIT_SINGLE_HPP

28
sprout/bit/testbit.hpp Normal file
View file

@ -0,0 +1,28 @@
/*=============================================================================
Copyright (c) 2011-2014 Bolero MURAKAMI
https://github.com/bolero-MURAKAMI/Sprout
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#ifndef SPROUT_BIT_TESTBIT_HPP
#define SPROUT_BIT_TESTBIT_HPP
#include <type_traits>
#include <sprout/config.hpp>
namespace sprout {
//
// testbit
//
template<typename Integral>
inline SPROUT_CONSTEXPR typename std::enable_if<
std::is_integral<Integral>::value,
bool
>::type
testbit(Integral x, int b) SPROUT_NOEXCEPT {
return x & (Integral(1) << b);
}
} // namespace sprout
#endif // #ifndef SPROUT_BIT_TESTBIT_HPP