// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.6.12; library BitUtils { function hasAnyOf(uint256 v, uint256 flags) internal pure returns (bool) { return v & flags != 0; } function hasAllOf(uint256 v, uint256 flags) internal pure returns (bool) { return v & flags == flags; } function isBit(uint256 v, uint8 index) internal pure returns (bool) { return v & (uint256(1) << index) != 0; } function hasNoneOf(uint256 v, uint256 flags) internal pure returns (bool) { return v & flags == 0; } function nextPowerOf2(uint256 v) internal pure returns (uint256) { if (v == 0) { return 1; } v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v |= v >> 32; v |= v >> 64; v |= v >> 128; return v + 1; } function isPowerOf2(uint256 v) internal pure returns (bool) { return (v & (v - 1)) == 0; } function isPowerOf2nz(uint256 v) internal pure returns (bool) { if (v == 0) { return false; } return (v & (v - 1)) == 0; } function bitLength(uint256 v) internal pure returns (uint256 len) { if (v == 0) { return 0; } if (v > type(uint128).max) { v >>= 128; len += 128; } if (v > type(uint64).max) { v >>= 64; len += 64; } if (v > type(uint32).max) { v >>= 32; len += 32; } if (v > type(uint16).max) { v >>= 16; len += 16; } if (v > type(uint8).max) { v >>= 8; len += 8; } if (v > 15) { v >>= 4; len += 4; } if (v > 3) { v >>= 2; len += 2; } if (v > 1) { len += 1; } return len; } }