问题
索博尔算法中用到了_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;
- }
-