BitMask64Segment 独立类型
This commit is contained in:
@@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user