【发布时间】:2026-01-09 02:30:01
【问题描述】:
下面的copy_bit 函数可以简化为out[out_bit] = in[in_bit] 之类的东西吗? (即不使用if 语句)
template< typename T >
inline void copy_bit( T& out, const T in, const std::size_t out_bit, const std::size_t in_bit )
{
if ( (in & (1 << in_bit)) != 0 )
{
out |= (1 << out_bit); // Set bit
}
else
{
out &= ~(1 << out_bit); // Clear bit
}
}
// Set bit 4 in x to bit 11 in y
copy_bit( x, y, 4, 11 );
更新:需要明确的是,这不是作业或 XY 问题,建议 std::bitset 可以回答问题。
【问题讨论】:
-
好吧,我们不关心家庭作业。我们应该只为实际应用解决问题。
-
@RoeeGavirel 你是对的,但我的意思是
out[out_bit] = in[in_bit]的那部分。是否有可能“直接”做到这一点? -
@Alireza:
out[out_bit] = in[in_bit]并不意味着必须直接更改位,因为在 C++ 中您可以重载operator[]。 -
尚未在任何地方提及,但未定义的行为是由
1 << in_bit引起的,如果in_bit >= CHAR_BIT * sizeof(int)不管T;考虑使用static_cast<T>(1),如果T可能已签名,则转换为T的未签名版本 -
+1 用于提及 XY 问题 :)
标签: c++ c++11 optimization bit-manipulation branch-prediction