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

Adr*_*ins 0 memory fortran bits

我有一个内存关键的FORTRAN程序,它目前使用两个整数数组,第一个使用4个BYTES整数,第二个使用1个BYTE整数.

两个数组都没有"完全"使用,即我知道存储在4字节数组中的数字不会超过一百万左右(所以我需要超过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.
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何修改整数,同时保留标志的内存.换句话说,我需要 IBITS 相反的功能,复制一个只分配最右边X位的整数.

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

Vla*_*r F 5

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

您必须将逻辑掩码准备为一个整数,其前两位中有一个,其他位置为零(或相反的位).