C++-获取以整数位为单位的大小
C++ - Getting size in bits of integer
我需要知道一个整数是否为32位长(我想知道它是否正好为32位(8个十六进制字符)。我如何在C++中实现这一点?我应该用十六进制表示还是用无符号整数表示?
我的代码如下:
mistream.open("myfile.txt");
if(mistream)
{
for(int i=0; i<longArray; i++)
{
mistream >> hex >> datos[i];
}
}
mistream.close();
其中,mistream是ifstream类型,而datos是一个无符号的int数组
感谢
std::numeric_limits<unsigned>::digits
是一个静态整数常数(或C++11中的constexpr),给出位数(由于无符号存储在基数2中,所以它给出二进制数字)。
你需要#include <limits>
才能得到这个,你会注意到这给出了与Thomas的答案相同的值(同时也可以推广到其他基元类型)
作为参考(我回答后您更改了问题),给定程序中给定类型(例如unsigned
)的每个整数大小完全相同。
您现在要问的不是以位为单位的整数的大小,因为这永远不会改变,而是是否设置了最高位。你可以用进行琐碎的测试
bool isTopBitSet(uint32_t v) {
return v & 0x80000000u;
}
(如果您想推广到除uint32_t
之外的无符号T,请用类似T{1} << (std::numeric_limits<T>::digits-1)
的东西替换无符号十六进制文字)。
正如@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");
中。
试试这个:
#include <climits>
unsigned int bits_per_byte = CHAR_BIT;
unsigned int bits_per_integer = CHAR_BIT * sizeof(int);
标识符CCD_ 10表示CCD_。
sizeof
返回整数所占据的字符位置的数量。
将它们相乘可以得到整数的位数。
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
。
我想知道它是否正好是32位长(8个十六进制字符)
我有兴趣知道这个值是否在功率(2,31)和功率(2、32)-1 之间
所以你想知道高位是否设置好了吗?然后你可以简单地测试数字是否为负数:
bool upperBitSet(int x)
{
return x < 0;
}
对于无符号数字,你可以简单地左移右移,然后检查你是否丢失了数据:
bool upperBitSet(unsigned x)
{
return (x << 1 >> 1) != x;
}
最简单的方法可能是检查是否设置了第32位:
bool isReally32bitsLong(uint32_t in) {
return (in >> 31)!=0;
}
bool isExactly32BitsLong(uint64_t in) {
return ((in >> 31)!=0) && ((in >> 32) == 0);
}
- 如何以毫秒为单位获取开始时间和 now() 之间的毫秒差异(以 C++为单位?
- 如何在没有硬编码的情况下以C++为单位获取类数组的长度?
- 获取嵌套 stl 容器的大小(以字节为单位)
- 可视化 如何获取图像中像素的颜色(以C++ (sfml) 为单位)
- 在Windows上获取OpenGL点大小(以像素为单位)?
- 仅使用C++中的标准库获取以毫秒为单位的当前日期和时间
- 如何使用闰秒以微秒为单位获取 UTC 时间
- 获取C++模板参数包的总大小(以字节为单位)
- tiny-utf8:以字符/代码点为单位获取偏移量
- 使用 c++ 获取两个日期与时间字符串之间的差异(以秒为单位)
- 如何在C++中以毫秒为单位获取今天的 UTC 午夜时间?
- 如何在跨平台 c++ 32 位系统中获取以毫秒为单位的时差
- 以 C++ 为单位获取当前时间(以月/日/年为单位)
- 如何以毫秒为单位获取自 1970 年以来的当前时间戳,就像 Java 一样
- 可视化 如何在C++中以微秒为单位获取系统时钟
- 如何使用"time.h"库(仅)以毫秒为单位获取当前时间?
- 在Unix类系统上以秒或毫秒为单位获取正常运行时间
- 以 XLL 为单位获取调用方定义的输出数组尺寸
- 如何以C++为单位获取文件的大小?
- 如何以秒为单位获取系统的当前日期时间