* 检查掩码是否包含所有指定的位 * @param mask 要检查的掩码 * @param bits 指定的位模式 * @returns 如果掩码包含bits中的所有位则返回true
(mask: BitMask64Data, bits: BitMask64Data)
| 79 | * @returns 如果掩码包含bits中的所有位则返回true |
| 80 | */ |
| 81 | public static hasAll(mask: BitMask64Data, bits: BitMask64Data): boolean { |
| 82 | const maskBase = mask.base; |
| 83 | const bitsBase = bits.base; |
| 84 | const maskSegments = mask.segments; |
| 85 | const bitsSegments = bits.segments; |
| 86 | const baseHasAll = (maskBase[SegmentPart.LOW] & bitsBase[SegmentPart.LOW]) === bitsBase[SegmentPart.LOW] && (maskBase[SegmentPart.HIGH] & bitsBase[SegmentPart.HIGH]) === bitsBase[SegmentPart.HIGH]; |
| 87 | // 基础区域就不包含指定的位,或bits没有扩展区段,直接短路。 |
| 88 | if(!baseHasAll || !bitsSegments) return baseHasAll; |
| 89 | |
| 90 | // 扩展区段的hasAll匹配逻辑 |
| 91 | const maskSegmentsLength = maskSegments?.length ?? 0; |
| 92 | // 对mask/bits中都存在的区段,进行hasAll判断 |
| 93 | if(maskSegments){ |
| 94 | for (let i = 0; i < Math.min(maskSegmentsLength,bitsSegments.length); i++) { |
| 95 | const maskSeg = maskSegments[i]!; |
| 96 | const bitsSeg = bitsSegments[i]!; |
| 97 | if((maskSeg[SegmentPart.LOW] & bitsSeg[SegmentPart.LOW]) !== bitsSeg[SegmentPart.LOW] || (maskSeg[SegmentPart.HIGH] & bitsSeg[SegmentPart.HIGH]) !== bitsSeg[SegmentPart.HIGH]){ |
| 98 | // 存在不匹配的位,直接短路 |
| 99 | return false; |
| 100 | } |
| 101 | } |
| 102 | } |
| 103 | // 对mask中不存在,但bits中存在的区段,进行isZero判断 |
| 104 | for (let i = maskSegmentsLength; i < bitsSegments.length; i++) { |
| 105 | const bitsSeg = bitsSegments[i]!; |
| 106 | if(bitsSeg[SegmentPart.LOW] !== 0 || bitsSeg[SegmentPart.HIGH] !== 0){ |
| 107 | // 存在不为0的区段,直接短路 |
| 108 | return false; |
| 109 | } |
| 110 | } |
| 111 | return true; |
| 112 | } |
| 113 | |
| 114 | /** |
| 115 | * 检查掩码是否不包含任何指定的位 |
no test coverage detected