Source

bit.js

/**
 * @description check bitflag if it is 1 in flag
 * @param { number } flag
 * @param { number } bitFlag
 * @returns { boolean }
 */
export function checkBit(flag, bitFlag) {
    /*
    因为js位操作有关的超过了32位后无效。所有位置0。第32位代表负数。且32位的左移1位就是直接跳回到第1位。  与java long类型移位操作不符。
    20131225修改  支持long 类型62位内的checkBit
      */
    let bit_31 = true;
    //31位皆置1为:2147483647
    if (flag > 2147483647 || flag < 0 || bitFlag > 2147483647 || bitFlag < 0) {
        bit_31 = false;
    }
    if (bit_31) {
        return (flag & bitFlag) === bitFlag;
    }

    let flagBinary = flag.toString(2);
    let bitFlagBinary = bitFlag.toString(2);
    if (flagBinary.length > 62 || bitFlagBinary.length > 62) {
        console.error(
            'Does not support more than 62 bit. flagBinary.length=' +
            flagBinary.length +
            ',bitFlagBinary.length' +
            bitFlagBinary.length +
            '.',
        );
        return false;
    }
    let flagLow;
    let bitFlagHight;
    let bitFlagLow;
    let flagHight;
    let lowStr;
    let hightStr;
    flagHight = flagLow = bitFlagHight = bitFlagLow = 0;
    //拆分高低位处理
    if (flagBinary.length > 31) {
        hightStr = flagBinary.slice(0, flagBinary.length - 31);
        lowStr = flagBinary.slice(flagBinary.length - 31);
        flagHight = parseInt(hightStr, '2');
        flagLow = parseInt(lowStr, '2');
    } else {
        flagLow = parseInt(flagBinary.slice(0, flagBinary.length), '2');
    }
    if (bitFlagBinary.length > 31) {
        hightStr = bitFlagBinary.slice(0, bitFlagBinary.length - 31);
        lowStr = bitFlagBinary.slice(bitFlagBinary.length - 31);
        bitFlagHight = parseInt(hightStr, '2');
        bitFlagLow = parseInt(lowStr, '2');
    } else {
        bitFlagLow = parseInt(
            bitFlagBinary.slice(0, bitFlagBinary.length),
            '2',
        );
    }

    let result = (flagLow & bitFlagLow) === bitFlagLow;
    if (result) {
        result = (flagHight & bitFlagHight) === bitFlagHight;
    }
    return result;
}



export function andBit(flag, bitFlag) {
	var bit_31 = true;
	//31位皆置1为:2147483647
	if (flag > 2147483647 || flag < 0 || bitFlag > 2147483647 || bitFlag < 0) {
		bit_31 = false;
	}
	if (bit_31) {
		return flag &= bitFlag;
	}
	
	var flagBinary = flag.toString(2);
	var bitFlagBinary = bitFlag.toString(2);
	if (flagBinary.length > 62 || bitFlagBinary.length > 62) {
		alert('Does not support more than 62 bit. flagBinary.length=' + flagBinary.length + ',bitFlagBinary.length' + bitFlagBinary.length + '.');
		return 0;
	}
	var flagLow;
	var bitFlagHight;
	var bitFlagLow;
	var flagHight;
	var lowStr;
	var hightStr;
	flagHight = flagLow = bitFlagHight = bitFlagLow = 0;
	//拆分高低位处理
	if (flagBinary.length > 31) {
		hightStr = flagBinary.slice(0, flagBinary.length - 31);
		lowStr = flagBinary.slice(flagBinary.length - 31);
		flagHight = parseInt(hightStr, '2');
		flagLow = parseInt(lowStr, '2');
	} else {
		flagLow = parseInt(flagBinary.slice(0, flagBinary.length), '2');
	}
	if (bitFlagBinary.length > 31) {
		hightStr = bitFlagBinary.slice(0, bitFlagBinary.length - 31);
		lowStr = bitFlagBinary.slice(bitFlagBinary.length - 31);
		bitFlagHight = parseInt(hightStr, '2');
		bitFlagLow = parseInt(lowStr, '2');
	} else {
		bitFlagLow = parseInt(bitFlagBinary.slice(0, bitFlagBinary.length), '2');
	}
	flagLow &= bitFlagLow;
	flagHight &= bitFlagHight;
	flagBinary = flagLow.toString(2);
	//低位补0
	for (;flagBinary.length < 31;) {
		flagBinary = '0' + flagBinary;
	}
	flagBinary = flagHight.toString(2) + flagBinary;
	return parseInt(flagBinary, '2');
};

export function orBit(flag, bitFlag) {
	var bit_31 = true;
	if (flag > 2147483647 || flag < 0 || bitFlag > 2147483647 || bitFlag < 0) {
		bit_31 = false;
	}
	if (bit_31) {
		return flag |= bitFlag;
	}
	
	var flagBinary = flag.toString(2);
	var bitFlagBinary = bitFlag.toString(2);
	if (flagBinary.length > 62 || bitFlagBinary.length > 62) {
		alert('Does not support more than 62 bit. flagBinary.length=' + flagBinary.length + ',bitFlagBinary.length' + bitFlagBinary.length + '.');
		return 0;
	}
	var flagLow;
	var bitFlagHight;
	var bitFlagLow;
	var flagHight;
	var lowStr;
	var hightStr;

	flagHight = flagLow = bitFlagHight = bitFlagLow = 0;
	if (flagBinary.length > 31) {
		hightStr = flagBinary.slice(0, flagBinary.length - 31);
		lowStr = flagBinary.slice(flagBinary.length - 31);
		flagHight = parseInt(hightStr, '2');
		flagLow = parseInt(lowStr, '2');
	} else {
		flagLow = parseInt(flagBinary.slice(0, flagBinary.length), '2');
	}
	if (bitFlagBinary.length > 31) {
		hightStr = bitFlagBinary.slice(0, bitFlagBinary.length - 31);
		lowStr = bitFlagBinary.slice(bitFlagBinary.length - 31);
		bitFlagHight = parseInt(hightStr, '2');
		bitFlagLow = parseInt(lowStr, '2');
	} else {
		bitFlagLow = parseInt(bitFlagBinary.slice(0, bitFlagBinary.length), '2');
	}
	flagLow |= bitFlagLow;
	flagHight |= bitFlagHight;
	flagBinary = flagLow.toString(2);
	//低位补0
	for (;flagBinary.length < 31;) {
		flagBinary = '0' + flagBinary;
	}
	flagBinary = flagHight.toString(2) + flagBinary;
	return parseInt(flagBinary, '2');
};