C ++ - 以整数位获取大小

时间:2015-03-26 17:41:25

标签: c++ c integer hex ifstream

我需要知道一个整数是否是32位长(我想知道它是否正好是32位长(8个十六进制字符)。我怎么能用C ++实现这个?我应该用十六进制表示或使用unsigned int one?

我的代码如下:     mistream.open(" myfile.txt的&#34);

if(mistream)
{
    for(int i=0; i<longArray; i++)
    {
        mistream >> hex >> datos[i];        
    }
}

mistream.close();

其中mistream的类型为ifstream,而datos是unsigned int数组

谢谢

6 个答案:

答案 0 :(得分:15)

std::numeric_limits<unsigned>::digits

是一个静态整数常量(或C ++ 11中的constexpr)给出的位数(因为无符号存储在基数2中,它给出二进制数字)。

您需要#include <limits>来获取此信息,并且您会注意到here这与Thomas&#39;提供的价值相同。回答(同时也可以推广到其他原始类型)


作为参考(我回答后你改变了问题),给定程序中给定类型的每个整数(例如unsigned)都是完全相同的

您现在要求的不是整数位的 size ,因为它永远不会变化,但是是否设置了最高位。您可以使用

进行简单的测试
bool isTopBitSet(uint32_t v) {
  return v & 0x80000000u;
}

(如果要概括为T{1} << (std::numeric_limits<T>::digits-1)以外的无符号T,请将无符号十六进制文字替换为uint32_t

答案 1 :(得分:3)

正如@chux在评论中暗示的那样,您可以使用sizeof运算符和CHAR_BIT宏常量的组合。前者告诉您(在编译时)其参数类型的大小(以sizeof(char)又称字节的倍数)。后者是字节的位数(通常为8)。

您可以很好地将其封装到函数模板中。

#include <climits>   // CHAR_BIT
#include <cstddef>   // std::size_t
#include <iostream>  // std::cout, std::endl

template <typename T>
constexpr std::size_t
bit_size() noexcept
{
  return sizeof(T) * CHAR_BIT;
}

int
main()
{
  std::cout << bit_size<int>() << std::endl;
  std::cout << bit_size<long>() << std::endl;
}

在我的实现中,它输出32和64。

由于该函数是constexpr,您可以在静态上下文中使用它,例如static_assert<bit_size<int>() >= 32, "too small");

答案 2 :(得分:1)

试试这个:

#include <climits>

unsigned int bits_per_byte = CHAR_BIT;
unsigned int bits_per_integer = CHAR_BIT * sizeof(int);

标识符CHAR_BIT表示char中的位数。

sizeof返回整数占用的char位置数。

将它们相乘给出了整数的位数。

答案 3 :(得分:0)

OP表示“如果它正好是32位长(8个十六进制字符)”并且还有“..有兴趣知道值是否在功率(2,31)和功率(2,32)-1之间”。所以在负32位数字上有点模糊。

当然OP想要根据值而不是类型知道结果。

bool integer_is_32_bits_long(int x) = 
    // cope with 32-bit int
    ((INT_MAX == 0x7FFFFFFF) && (x < 0)) ||
    // larger 32-bit int
    ((INT_MAX >  0x7FFFFFFF) && (x >= 0x80000000) && (x <= 0xFFFFFFFF));

当然如果int是16位,那么结果总是false

答案 4 :(得分:0)

  

我想知道它是否正好是32位长(8个十六进制字符)

     

我很想知道这个数值是在权力(2,31)和权力(2,32)之间 - 1

所以你想知道是否设置了高位?然后你可以简单地测试数字是否为负数:

bool upperBitSet(int x)
{
    return x < 0;
}

对于无符号数字,您只需向左和向右移动,然后检查是否丢失了数据:

bool upperBitSet(unsigned x)
{
    return (x << 1 >> 1) != x;
}

答案 5 :(得分:-2)

最简单的方法可能是检查第32位是否设置:

bool isReally32bitsLong(uint32_t in) {
  return (in >> 31)!=0;
}

bool isExactly32BitsLong(uint64_t in) {
  return ((in >> 31)!=0) && ((in >> 32) == 0);
}