C++ 位掩码和长掩码

C++ 位掩码和长掩码,c++,C++,我有一个屏蔽过程(为给定大小的下半部分创建一个全1位屏蔽): 模板 T下半部分(){ T一半=((尺寸f(T)*8)/2); T掩码=(1左移位是移位1,默认情况下为int,在您的机器上可能是32位。当您将1移位时,将移位操作中的1转换为正确的类型。实际上,它是一个简单的整数,因此移位没有任何效果——您将位移位为不存在的值。表达式1所以您的意思是n(1@dasblinkenlight:准确程度如何?@Nawaz:如果int的值小于等于32位,表达式1@dasblinkenlight:是的。这是正

我有一个屏蔽过程(为给定大小的下半部分创建一个全1位屏蔽):

模板
T下半部分(){
T一半=((尺寸f(T)*8)/2);

T掩码=(1左移位是移位1,默认情况下为
int
,在您的机器上可能是32位。当您将
1移位时,将移位操作中的
1
转换为正确的类型。实际上,它是一个简单的整数,因此移位没有任何效果——您将位移位为不存在的值。

表达式
1所以您的意思是n
(1@dasblinkenlight:准确程度如何?@Nawaz:如果
int
的值小于等于32位,表达式
1@dasblinkenlight:是的。这是正确的,但这个答案没有提到UB,这就是我问这个问题的原因。@MarkLakata:是的,如果没有错,你的答案是误导性的。如果你理解它的错误,请更正它。+1。这是答案到目前为止,答案是正确的,因为它还谈到了原始代码中的“未定义行为”。整数的一半位的正确拼写是
std::numeric\u limits::digits/2
。上面使用的表达式假设
char
有8位,这是必需的(尽管我不知道有哪个平台不是8位).啊,知道这个很有意思,谢谢。@DietmarKühl:我听说Windows CE有一个16位的字节。@DietmarKühl:我想你的意思是
char
不需要是8位。(事实上,它至少需要8位,而且在大多数实现中都是位。)@纳瓦兹:如果Windows CE有
CHAR\u BIT==16
,我会非常惊讶。它可能使用16位字符(对于UCS-2和/或UTF-16),但使用
wchar\u t
或其他等效字符来表示它们。我希望预定义的
CHAR
类型是8位。
template<class T>
T bottom_half() {
    T halfway = ((sizeof(T) * 8) / 2);
    T mask = (1 << halfway) - 1;

    return mask;
}
#include <limits.h>

template<class T>
T bottom_half() {
    T halfway = ((sizeof(T) * CHAR_BIT) / 2);
    T mask = ((T)1 << halfway) - 1;

    return mask;
}