ELC in dev
ELC-lang
载入中...
搜索中...
未找到
elc::defs::base::bit 命名空间参考

class  rot_iterator
 

函数

template<unsigned_basic_integer_type T>
constexpr size_t countl_zero (const T v) noexcept
 countl_zero
 
template<unsigned_basic_integer_type T>
constexpr size_t countr_zero (const T v) noexcept
 countr_zero
 
template<unsigned_basic_integer_type T>
constexpr size_t countl_one (const T v) noexcept
 countl_one
 
template<unsigned_basic_integer_type T>
constexpr size_t countr_one (const T v) noexcept
 countr_one
 
template<unsigned_basic_integer_type T>
constexpr size_t get_bitnum (const T v) noexcept
 获取位数
 
template<unsigned_basic_integer_type T>
constexpr auto rotl_nomod (const T v, const auto R) noexcept
 位操作:循环左移(无mod) 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼
 
template<unsigned_basic_integer_type T>
constexpr auto rotr_nomod (const T v, const auto r) noexcept
 位操作:循环右移(无mod) 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼
 
template<unsigned_basic_integer_type T>
constexpr auto rotr (const T v, const auto R) noexcept
 位操作:循环右移 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼
 
template<unsigned_basic_integer_type T>
constexpr auto rotl (const T v, const auto R) noexcept
 位操作:循环左移 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼
 
template<unsigned_basic_integer_type T>
constexpr auto rotl_nomod (const T v, const rot_iterator< T > &r) noexcept
 位操作:循环左移(无mod) 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼
 
template<unsigned_basic_integer_type T>
constexpr auto rotr_nomod (const T v, const rot_iterator< T > &r) noexcept
 位操作:循环右移(无mod) 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼
 
template<unsigned_basic_integer_type T>
constexpr auto rotl (const T v, const rot_iterator< T > &r) noexcept
 位操作:循环左移 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼
 
template<unsigned_basic_integer_type T>
constexpr auto rotr (const T v, const rot_iterator< T > &r) noexcept
 位操作:循环右移 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼
 
template<unsigned_basic_integer_type T>
constexpr bool all_bit_is_one (const T v) noexcept
 is_all_bit_one
 
template<unsigned_basic_integer_type T>
constexpr bool all_bit_is_zero (const T v) noexcept
 is_all_bit_zero
 

变量

template<unsigned_basic_integer_type T>
constexprnpos_of =T(-1)
 用以指定不存在的位置
 
constexpr auto npos =npos_of<size_t>
 

函数说明

◆ all_bit_is_one()

template<unsigned_basic_integer_type T>
constexpr bool elc::defs::base::bit::all_bit_is_one ( const v)
inlineconstexprnoexcept

is_all_bit_one

在文件 all_defs.cpp8736 行定义.

8736 {
8737 return v==npos_of<T>;
8738 }
函数调用图:
这是这个函数的调用关系图:

◆ all_bit_is_zero()

template<unsigned_basic_integer_type T>
constexpr bool elc::defs::base::bit::all_bit_is_zero ( const v)
inlineconstexprnoexcept

is_all_bit_zero

在文件 all_defs.cpp8741 行定义.

8741 {
8742 return v;
8743 }
函数调用图:
这是这个函数的调用关系图:

◆ countl_one()

template<unsigned_basic_integer_type T>
constexpr size_t elc::defs::base::bit::countl_one ( const v)
inlineconstexprnoexcept

countl_one

在文件 all_defs.cpp8701 行定义.

8701 {
8702 if constexpr(sizeof(T)!=1){//优化
8703 typedef unsigned_specific_size_t<sizeof(T)/2> half_t;
8704 constexpr size_t half_bitnum = bitnum_of(half_t);
8705 const half_t high = half_t(v>>half_bitnum);
8706 if(high == half_t(-1))
8707 return half_bitnum+countl_one(half_t(v));
8708 else
8709 return countl_one(high);
8710 }
8711 else{
8712 //默认通用实现
8713 //return countl_zero(T(~v));,或者
8714 constexpr T first_bit = T(1)<<(bitnum_of(T)-1);
8715 return v&first_bit?countl_one(T(v<<1))+1:0;
8716 }
8717 }
#define bitnum_of(...)
Definition all_defs.cpp:578
constexpr size_t countl_one(const T v) noexcept
countl_one
函数调用图:
这是这个函数的调用关系图:

◆ countl_zero()

template<unsigned_basic_integer_type T>
constexpr size_t elc::defs::base::bit::countl_zero ( const v)
inlineconstexprnoexcept

countl_zero

在文件 all_defs.cpp8669 行定义.

8669 {
8670 if constexpr(sizeof(T)!=1){//优化
8671 typedef unsigned_specific_size_t<sizeof(T)/2> half_t;
8672 constexpr size_t half_bitnum = bitnum_of(half_t);
8673 const half_t high = half_t(v>>half_bitnum);
8674 if(high)
8675 return countl_zero(high);
8676 else
8677 return half_bitnum+countl_zero(half_t(v));
8678 }
8679 else
8680 //默认通用实现
8681 return bitnum_of(T)-get_bitnum(v);
8682 }
constexpr size_t get_bitnum(const T v) noexcept
获取位数
constexpr size_t countl_zero(const T v) noexcept
countl_zero
函数调用图:
这是这个函数的调用关系图:

◆ countr_one()

template<unsigned_basic_integer_type T>
constexpr size_t elc::defs::base::bit::countr_one ( const v)
inlineconstexprnoexcept

countr_one

在文件 all_defs.cpp8685 行定义.

8685 {
8686 if constexpr(sizeof(T)!=1){//优化
8687 typedef unsigned_specific_size_t<sizeof(T)/2> half_t;
8688 constexpr size_t half_bitnum = bitnum_of(half_t);
8689 const half_t low = half_t(v);
8690 if(low == half_t(-1))
8691 return half_bitnum+countr_one(half_t(v>>half_bitnum));
8692 else
8693 return countr_one(low);
8694 }
8695 else
8696 //默认通用实现
8697 return v&1?countr_one(T(v>>1))+1:0;
8698 }
constexpr size_t countr_one(const T v) noexcept
countr_one
函数调用图:
这是这个函数的调用关系图:

◆ countr_zero()

template<unsigned_basic_integer_type T>
constexpr size_t elc::defs::base::bit::countr_zero ( const v)
inlineconstexprnoexcept

countr_zero

在文件 all_defs.cpp8720 行定义.

8720 {
8721 if constexpr(sizeof(T)!=1){//优化
8722 typedef unsigned_specific_size_t<sizeof(T)/2> half_t;
8723 constexpr size_t half_bitnum = bitnum_of(half_t);
8724 const half_t low = half_t(v);
8725 if(low)
8726 return countr_zero(low);
8727 else
8728 return half_bitnum+countr_zero(half_t(v>>half_bitnum));
8729 }
8730 else
8731 //默认通用实现
8732 return countr_one(T(~v));
8733 }
constexpr size_t countr_zero(const T v) noexcept
countr_zero
函数调用图:
这是这个函数的调用关系图:

◆ get_bitnum()

template<unsigned_basic_integer_type T>
constexpr size_t elc::defs::base::bit::get_bitnum ( const v)
inlineconstexprnoexcept

获取位数

在文件 all_defs.cpp8648 行定义.

8648 {
8649 if constexpr(sizeof(T)!=1){//优化
8650 typedef unsigned_specific_size_t<sizeof(T)/2> half_t;
8651 constexpr size_t half_bitnum = bitnum_of(half_t);
8652 const half_t high = half_t(v>>half_bitnum);
8653 if(high)
8654 return half_bitnum+get_bitnum(high);
8655 else
8656 return get_bitnum(half_t(v));
8657 }
8658 else
8659 //默认通用实现
8660 return v?get_bitnum(T(v>>1))+1:0;
8661 }
函数调用图:
这是这个函数的调用关系图:

◆ rotl() [1/2]

template<unsigned_basic_integer_type T>
constexpr auto elc::defs::base::bit::rotl ( const v,
const auto  R 
)
inlineconstexprnoexcept

位操作:循环左移 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼

在文件 all_defs.cpp8585 行定义.

8585 {
8586 constexpr auto d = ::std::numeric_limits<T>::digits;
8587 const auto r = mod(R,d);
8588 return rotl_nomod(v,r);
8589 }
constexpr auto rotl_nomod(const T v, const auto R) noexcept
位操作:循环左移(无mod) 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼
函数调用图:
这是这个函数的调用关系图:

◆ rotl() [2/2]

template<unsigned_basic_integer_type T>
constexpr auto elc::defs::base::bit::rotl ( const v,
const rot_iterator< T > &  r 
)
inlineconstexprnoexcept

位操作:循环左移 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼

在文件 all_defs.cpp8637 行定义.

8637 {
8638 return rotl_nomod(v,r);
8639 }
函数调用图:

◆ rotl_nomod() [1/2]

template<unsigned_basic_integer_type T>
constexpr auto elc::defs::base::bit::rotl_nomod ( const v,
const auto  R 
)
inlineconstexprnoexcept

位操作:循环左移(无mod) 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼

在文件 all_defs.cpp8556 行定义.

8556 {
8557 constexpr auto d = ::std::numeric_limits<T>::digits;
8558 if constexpr(unsigned_type<decltype(r)>){
8559 if(r)
8560 return rot_base(<<,>>);
8561 else
8562 return v;
8563 }
8564 else{
8565 if(r>0)
8566 return rot_base(<<,>>);
8567 elseif(r==0)
8568 return v;
8569 else//r<0
8570 return rotr_nomod(v,0-r);
8571 }
8572 }
else
#define elseif
Definition all_defs.cpp:650
#define rot_base(opt, antiopt)
函数调用图:
这是这个函数的调用关系图:

◆ rotl_nomod() [2/2]

template<unsigned_basic_integer_type T>
constexpr auto elc::defs::base::bit::rotl_nomod ( const v,
const rot_iterator< T > &  r 
)
inlineconstexprnoexcept

位操作:循环左移(无mod) 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼

在文件 all_defs.cpp8625 行定义.

8625 {
8626 return rotl_nomod(v,r.value());
8627 }
constexpr size_t value() const noexcept
函数调用图:

◆ rotr() [1/2]

template<unsigned_basic_integer_type T>
constexpr auto elc::defs::base::bit::rotr ( const v,
const auto  R 
)
inlineconstexprnoexcept

位操作:循环右移 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼

在文件 all_defs.cpp8577 行定义.

8577 {
8578 constexpr auto d = ::std::numeric_limits<T>::digits;
8579 const auto r = mod(R,d);
8580 return rotr_nomod(v,r);
8581 }
constexpr auto rotr_nomod(const T v, const auto r) noexcept
位操作:循环右移(无mod) 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼
函数调用图:
这是这个函数的调用关系图:

◆ rotr() [2/2]

template<unsigned_basic_integer_type T>
constexpr auto elc::defs::base::bit::rotr ( const v,
const rot_iterator< T > &  r 
)
inlineconstexprnoexcept

位操作:循环右移 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼

在文件 all_defs.cpp8643 行定义.

8643 {
8644 return rotr_nomod(v,r);
8645 }
函数调用图:

◆ rotr_nomod() [1/2]

template<unsigned_basic_integer_type T>
constexpr auto elc::defs::base::bit::rotr_nomod ( const v,
const auto  r 
)
inlineconstexprnoexcept

位操作:循环右移(无mod) 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼

在文件 all_defs.cpp8536 行定义.

8536 {
8537 constexpr auto d = ::std::numeric_limits<T>::digits;
8538 if constexpr(unsigned_type<decltype(r)>){
8539 if(r)
8540 return rot_base(>>,<<);
8541 else
8542 return v;
8543 }
8544 else{
8545 if(r>0)
8546 return rot_base(>>,<<);
8547 elseif(r==0)
8548 return v;
8549 else//r<0
8550 return rotl_nomod(v,0-r);
8551 }
8552 }
函数调用图:
这是这个函数的调用关系图:

◆ rotr_nomod() [2/2]

template<unsigned_basic_integer_type T>
constexpr auto elc::defs::base::bit::rotr_nomod ( const v,
const rot_iterator< T > &  r 
)
inlineconstexprnoexcept

位操作:循环右移(无mod) 不使用std版本而是自己写的原因:std版本右操作数只能是int而不能是size_t或别的,标准会傻逼

在文件 all_defs.cpp8631 行定义.

8631 {
8632 return rotr_nomod(v,r.value());
8633 }
函数调用图:

变量说明

◆ npos

constexpr auto elc::defs::base::bit::npos =npos_of<size_t>
constexpr

在文件 all_defs.cpp8527 行定义.

◆ npos_of

template<unsigned_basic_integer_type T>
constexpr T elc::defs::base::bit::npos_of =T(-1)
constexpr

用以指定不存在的位置

在文件 all_defs.cpp8525 行定义.