Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式计算值类型的大小_Java_Unit Testing_Sizeof_Bitmask_Memory Size - Fatal编程技术网

Java 以编程方式计算值类型的大小

Java 以编程方式计算值类型的大小,java,unit-testing,sizeof,bitmask,memory-size,Java,Unit Testing,Sizeof,Bitmask,Memory Size,我正在为一个将布尔值打包成字节的方法编写一个单元测试。不同的位位置由enum的值决定,enum目前只有5个值,但可以想象(尽管极不可能)这个数字会变为9 我想要一个简单的测试,大致如下: 私有字节m_myNum; 枚举MyEnum{…} Java字节中的assert(sizeof(m_myNum)具有固定大小(8位),因此不需要sizeof。首先,是的,Java中没有sizeof运算符。但是sizeof(byte)始终是1。这真的是你的意思吗 第二,你打算如何将9个布尔值放入一个字节?我希望不是

我正在为一个将布尔值打包成字节的方法编写一个单元测试。不同的位位置由enum的值决定,enum目前只有5个值,但可以想象(尽管极不可能)这个数字会变为9

我想要一个简单的测试,大致如下:

私有字节m_myNum; 枚举MyEnum{…}


Java字节中的assert(sizeof(m_myNum)具有固定大小(8位),因此不需要sizeof。

首先,是的,Java中没有sizeof运算符。但是sizeof(byte)始终是1。这真的是你的意思吗

第二,你打算如何将9个布尔值放入一个字节?我希望不是用位掩码

如果您只想找到设置的最高位,可以使用
Integer.highestOneBit(m_myNum&0xFF)
(参见文档)


编辑:当枚举中的值太多时,您谈论将存储更改为更大的类型。根据,没有内存理由不使用
byte
而不是
int
,除非您有一个数组。因此,我建议至少使用
int
,如果大小超过32,则升级到
long
。简单的en嗯?

我发现这可能对你有帮助:-)


不幸的是,Java中没有sizeof(),但请看一下这些问题的答案。我发现一个有趣的测试来自JavaWorld。

我认为这个测试符合您的要求。这可能是浪费你的时间来获得比这更通用

public void testEnumSizeLessThanOneByte() throws Exception 
{ 
    assertTrue("MyEnum must have 8 or less values.", 
                MyEnum.values().length <= 8);
}
public void testEnumSizeLessThanOneByte()引发异常
{ 
assertTrue(“MyEnum必须具有8个或更少的值。”,

MyEnum.values().length我知道您正试图想出一个通用的解决方案,但在这种情况下,我会采取懒惰的方式,硬编码大小并添加一些注释

static final int MAX_BITS_IN_MY_NUM = 8; // Currently set to size of a byte. // Update if data type changes from byte to something larger than a byte. ... assertTrue(MAX_BITS_IN_MY_NUM >= MyEnum.values().length); 静态final int MAX_BITS_IN_MY_NUM=8;//当前设置为字节大小。 //如果数据类型从字节更改为大于字节的值,则更新。 ... assertTrue(我的最大字节数>=MyEnum.values().length);
如果这是一个真正的问题,并且性能没有那么重要,那么您可以始终使用一个

我当前的想法是一组公共的静态实用方法,比如:int-sizeOf(byte b){return 8;}int-sizeOf(int-b){return 32;}int-sizeOf(long b){return 64;}或者是否有一个size()运算符?是的,当然,我错了。不过,我想重点仍然是。至于byte vs int,我的印象是1.6解决了这个问题,现在更紧凑了。问题仍然是什么时候进行更新。向枚举添加第33项的开发人员不太可能意识到它破坏了我的实现。我需要这个单元测试来提醒他们。在这篇文章()中,据说byte和boolean(作为类成员)是4字节。你能为你的声明提供可靠的证明吗,即sizeof(byte)==1?@dma_k:JLS和JVM规范都没有指定每种数据类型在内存中的大小;它们只是说明所需的值范围。JVM可以自由使用它希望存储的任何值的内存。我猜(尽管我没有研究过它)大多数JVM在4或8字节边界上对齐所有变量,即使是较小类型的变量。但是在数组中,JVM更容易将值打包在一起。因此,总结一下,我所说的
sizeof(byte)==1
是因为
字节中的可用位数不可能随JVM的不同而变化。遗憾的是,我就是这么做的。(使用byte.SIZE代替)。重载的sizeOf(…)似乎太重了。如果出现更多,我会切换。如果有人提出更优雅的解决方案,请分享!