【发布时间】:2022-07-06 23:14:10
【问题描述】:
假设您有数字 2,其二进制表示为 0010 如何交换位于位置 0 和 2 的位以及位于 1 和 3 的位? 所以结果是 1000,即数字 8?
如果我尝试使用 mvbits 交换位 0 和 2:
integer :: s1
s1= 2
call mvbits(s1,1,1,s1,3)
结果是数字10
这样的操作有内在函数吗?
【问题讨论】:
假设您有数字 2,其二进制表示为 0010 如何交换位于位置 0 和 2 的位以及位于 1 和 3 的位? 所以结果是 1000,即数字 8?
如果我尝试使用 mvbits 交换位 0 和 2:
integer :: s1
s1= 2
call mvbits(s1,1,1,s1,3)
结果是数字10
这样的操作有内在函数吗?
【问题讨论】:
mvbit 复制这些位。它不会移动位,您似乎希望将移动的位重置为零。您所发现的本质上是一个允许的混叠问题。您将 1 从 0010 复制到第三个位置以获得 1010。请考虑以下几点:
program foo
implicit none
integer(1) i, j
j = 0
i = 2
call mvbits(i, 1, 1, j, 3)
write(*,'(B8.8,1X,B8.8,1X,2I3)') i, j, i, j
call mvbits(i, 1, 1, j, 3)
write(*,'(B8.8,1X,B8.8,1X,2I3)') i, j, i, j
end program foo
【讨论】: