与IBITS的功能相反?如何使用位子集在 FORTRAN 中存储整数?



>我有一个内存关键型FORTRAN程序,目前它使用两个整数数组,第一个使用4字节整数,第二个使用1字节整数。

两个数组都没有"完全"使用,即我知道存储在 4 字节数组中的数字不会超过 100 万左右(所以我需要超过 2 个字节,但我没有使用 4 字节的所有位(,同样我只使用 2 位 1 字节数组作为"标志"。

为了节省内存,我想尝试将两者结合起来,即使用 4 字节数组最左边的两个位来存储 2 个标志。

现在我知道如果我先设置 INTEGER 值,我随后可以使用 IBSET/IBCLR 设置标志,并且仍然使用 IBITS 函数安全地提取我的整数以提取最右边的 X 位(在本例中为 X=28(:

integer(kind=4) :: imark,inum 
imark=600245 ! example number 
! use bits 29 and 30 to store flags...
imark=IBSET(imark,29) 
imark=IBSET(imark,30)
print *,imark ! gives 1611212981
! extract right most bits:
inum=IBITS(imark,0,28)
print *,inum  ! gives back 600245 as desired.

但是,我不知道如何在保留标志内存的同时修改整数。 换句话说,我需要与 IBITS相反的函数,以复制仅分配 X 最右边位的整数。

显然,如果我分配一个新的整数值(imark=343525(,它将重置标志位。 我可以编写一个函数,一次循环浏览新整数值最右边的 X 位,然后在我的 4 字节数组中使用 IBSET/IBCLR 设置它们,但这似乎很冗长。 但是我没有找到任何内在函数来执行此任务。

Fortran 2008 中有内在函数merge_bits(i, j, mask)。它根据逻辑掩码合并两个整数的位。

您必须准备一个逻辑掩码作为整数,该整数在前两位中有 1,在其他地方(或相反位(有零。

最新更新