BitMask64Segment 独立类型

This commit is contained in:
YHH
2025-09-30 15:56:28 +08:00
parent db73b077c5
commit 38763de7f6

View File

@@ -1,3 +1,13 @@
/**
* 基础 64 位段结构
*/
export interface BitMask64Segment {
/** 低32位bit 0-31 */
lo: number;
/** 高32位bit 32-63 */
hi: number;
}
/** /**
* 位掩码数据结构 * 位掩码数据结构
* 基础模式64位使用 lo + hi 存储 64 位segments 为空 * 基础模式64位使用 lo + hi 存储 64 位segments 为空
@@ -10,7 +20,7 @@ export interface BitMask64Data {
/** 高32位bit 32-63 */ /** 高32位bit 32-63 */
hi: number; hi: number;
/** 扩展段数组,每个元素是一个 64 位段,用于超过 64 位的场景 */ /** 扩展段数组,每个元素是一个 64 位段,用于超过 64 位的场景 */
segments?: BitMask64Data[]; segments?: BitMask64Segment[];
} }
export class BitMask64Utils { export class BitMask64Utils {
@@ -78,10 +88,12 @@ export class BitMask64Utils {
return bits.segments.every(seg => BitMask64Utils.isZero(seg)); return bits.segments.every(seg => BitMask64Utils.isZero(seg));
} }
// 递归检查每个扩展段 // 检查每个扩展段
const minSegments = Math.min(mask.segments.length, bits.segments.length); const minSegments = Math.min(mask.segments.length, bits.segments.length);
for (let i = 0; i < minSegments; i++) { for (let i = 0; i < minSegments; i++) {
if (!BitMask64Utils.hasAll(mask.segments[i], bits.segments[i])) { const maskSeg = mask.segments[i];
const bitsSeg = bits.segments[i];
if ((maskSeg.lo & bitsSeg.lo) !== bitsSeg.lo || (maskSeg.hi & bitsSeg.hi) !== bitsSeg.hi) {
return false; return false;
} }
} }
@@ -111,7 +123,7 @@ export class BitMask64Utils {
* @param mask 要检查的掩码 * @param mask 要检查的掩码
* @returns 如果掩码所有位都为0则返回true * @returns 如果掩码所有位都为0则返回true
*/ */
public static isZero(mask: BitMask64Data): boolean { public static isZero(mask: BitMask64Data | BitMask64Segment): boolean {
return mask.lo === 0 && mask.hi === 0; return mask.lo === 0 && mask.hi === 0;
} }
@@ -297,11 +309,16 @@ export class BitMask64Utils {
// 扩展 segments 数组 // 扩展 segments 数组
while (mask.segments.length <= segmentIndex) { while (mask.segments.length <= segmentIndex) {
mask.segments.push(BitMask64Utils.clone(BitMask64Utils.ZERO)); mask.segments.push({ lo: 0, hi: 0 });
} }
// 设置对应段的位 // 设置对应段的位
BitMask64Utils.setBit(mask.segments[segmentIndex], localBitIndex); const segment = mask.segments[segmentIndex];
if (localBitIndex < 32) {
segment.lo |= (1 << localBitIndex);
} else {
segment.hi |= (1 << (localBitIndex - 32));
}
} }
/** /**
@@ -330,8 +347,13 @@ export class BitMask64Utils {
} }
const localBitIndex = bitIndex % 64; const localBitIndex = bitIndex % 64;
const testMask = BitMask64Utils.create(localBitIndex); const segment = mask.segments[segmentIndex];
return BitMask64Utils.hasAny(mask.segments[segmentIndex], testMask);
if (localBitIndex < 32) {
return (segment.lo & (1 << localBitIndex)) !== 0;
} else {
return (segment.hi & (1 << (localBitIndex - 32))) !== 0;
}
} }
/** /**
@@ -359,6 +381,12 @@ export class BitMask64Utils {
} }
const localBitIndex = bitIndex % 64; const localBitIndex = bitIndex % 64;
BitMask64Utils.clearBit(mask.segments[segmentIndex], localBitIndex); const segment = mask.segments[segmentIndex];
if (localBitIndex < 32) {
segment.lo &= ~(1 << localBitIndex);
} else {
segment.hi &= ~(1 << (localBitIndex - 32));
}
} }
} }