我正在嘗試根據位掩碼拆分位元組。
考慮這兩個位元組(二進制中的 1000 作為 short int):
11101000
00000011
還有這三個面具:
00000011
11111111
00111111
我想要做的是根據提供的掩碼將兩個原始位元組分成三個位元組。
結果應該是:
00000000 對于第一個位元組
11111010 對于第二個(由于掩碼,原始位元組 1 和 2 合并了)
00000000 對于第三個(剩余位用零填充)
在 Java 或 C 中最簡單的方法是什么?
uj5u.com熱心網友回復:
在 C 中,如果使用 x86,這是一個單一的pdep操作。
#include <immintrin.h>
int msk(int num) {
int src = 0b0000001111101000;
int mask = 0b001111111111111100000011;
int result = _pdep_u32(src,mask);
int expected_result = 0b000000001111101000000000;
if (result == expected_result) {
return 1; // returns this
} else {
return 0;
}
}
請參閱英特爾內部指南中的 _pdep_u32。
https://godbolt.org/z/b6E6M8518
如果您的輸入/輸出是恰好 4 個位元組的陣列,則您可以memcpy從陣列int來回。
如果您不僅針對 x86,還針對沒有 BMI2 的舊 x86,或者想要 Java 解決方案,則必須從 PDEP 檔案中實作此演算法:
tmp := a
dst := 0
m := 0
k := 0
DO WHILE m < 32
IF mask[m] == 1
dst[m] := tmp[k]
k := k 1
FI
m := m 1
OD
dst[m]或者tmp[k]可以通過陣列索引和位移來完成,具體來說dst[m] := tmp[k]是(假設為 8 位位元組):
unsigned char bit = (dst[k/8] >> (k%8)) & 1;
dst[m/8] |= bit << (m%8)
請注意,直接實作不僅有點復雜,而且效率也較低,pdep單個 CPU 指令也是如此。但是我不確定Java是否公開它,如果沒有,那么使用JNI呼叫C實作是否值得。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/381448.html
