问题
索博尔算法中用到了_BitScanForward这个函数,在做统信UOS适配的时候发现这个函数是MSVC专有的,百度了一下linux下对应的有__builtin_ctz相关的系列函数
头文件引用
* | win | linux |
---|---|---|
头文件 | intrin.h | x86intrin.h |
函数 | _BitScanForward | __builtin_ctzl |
代码对比
win
#include <iostream>
#include <intrin.h>
using namespace std;
#pragma intrinsic(_BitScanForward)
static const unsigned QRNG_NDMS = 32;
struct
{
unsigned __int64 uValue;
unsigned uPrevSeed;
} m_prev[QRNG_NDMS];
unsigned __int64 cjn[QRNG_NDMS][63] = { 0 };
int main()
{
unsigned long mask = 0;
unsigned long index;
unsigned char isNonzero;
unsigned m_uCurSeed = 2048,m_uCurDim;
m_uCurDim = 0;
unsigned grayCode = (m_uCurSeed >> 1) ^ m_uCurSeed;
unsigned changedBits = m_prev[m_uCurDim].uPrevSeed ^ grayCode;
unsigned long uBit;
while (_BitScanForward(&uBit, changedBits))
{
cout << uBit << endl << changedBits <<endl;
m_prev[m_uCurDim].uValue ^= cjn[m_uCurDim][uBit];
changedBits &= ~(1 << uBit);
}
cout << uBit << endl << changedBits <<endl;
return 0;
}
Linux
#include <iostream>
#include <x86intrin.h>
using namespace std;
static const unsigned QRNG_NDMS = 32;
struct
{
unsigned long long uValue;
unsigned uPrevSeed;
} m_prev[QRNG_NDMS];
unsigned long long cjn[QRNG_NDMS][63] = { 0 };
int main(int, char**) {
unsigned long mask = 0;
unsigned long index = 0;
unsigned char isNonzero;
unsigned m_uCurSeed = 2048,m_uCurDim;
m_uCurDim = 0;
unsigned grayCode = (m_uCurSeed >> 1) ^ m_uCurSeed;
unsigned changedBits = m_prev[m_uCurDim].uPrevSeed ^ grayCode;
unsigned long uBit;
cout << __builtin_ctzl(10) << endl;
while (true)
{
uBit = __builtin_ctzl(changedBits);
if(uBit >= 64){
break;
}
cout << uBit << endl << changedBits <<endl;
m_prev[m_uCurDim].uValue ^= cjn[m_uCurDim][uBit];
changedBits &= ~(1 << uBit);
}
cout << uBit << endl << changedBits <<endl;
}