JavaScript 作 ▸ 2019-04-04 17:39 改 ▸ 2019-04-04 18:24 JavaScriptでバイトの左からnビット目を抽出する #JavaScript バイナリいじってて使った もくじ バイトの左からnビット目を1桁抽出/** * バイトの左からnビット目を1桁抽出して返却 * @param {Number} b - バイト (0~255) * @param {Number} n - 左からn番目 (1~8) * @return {Number} 0 or 1 */ const extractBit = (b, n) => { if (b < 0 || 255 < b) { throw new RangeError('値は0~255の範囲内で指定してください。'); } if (n < 1 || 8 < n) { throw new RangeError('位置は1~8番目の範囲内で指定してください。'); } const c = 8 - n; return (b & (1 << c)) >> c; };通ったテストconsole.assert( extractBit(0b00000001, 1) === 0 ); console.assert( extractBit(0b00000001, 2) === 0 ); console.assert( extractBit(0b00000001, 3) === 0 ); console.assert( extractBit(0b00000001, 4) === 0 ); console.assert( extractBit(0b00000001, 5) === 0 ); console.assert( extractBit(0b00000001, 6) === 0 ); console.assert( extractBit(0b00000001, 7) === 0 ); console.assert( extractBit(0b00000001, 8) === 1 ); console.assert( extractBit(0b10000000, 1) === 1 ); console.assert( extractBit(0b10000000, 2) === 0 ); console.assert( extractBit(0b10000000, 3) === 0 ); console.assert( extractBit(0b10000000, 4) === 0 ); console.assert( extractBit(0b10000000, 5) === 0 ); console.assert( extractBit(0b10000000, 6) === 0 ); console.assert( extractBit(0b10000000, 7) === 0 ); console.assert( extractBit(0b10000000, 8) === 0 ); console.assert( extractBit(0b01111110, 1) === 0 ); console.assert( extractBit(0b01111110, 2) === 1 ); console.assert( extractBit(0b01111110, 3) === 1 ); console.assert( extractBit(0b01111110, 4) === 1 ); console.assert( extractBit(0b01111110, 5) === 1 ); console.assert( extractBit(0b01111110, 6) === 1 ); console.assert( extractBit(0b01111110, 7) === 1 ); console.assert( extractBit(0b01111110, 8) === 0 );バイトの左からnビット目をlen桁まで抽出/** * バイトの左からnビット目をlen桁まで抽出して返却 * @param {Number} b - バイト (0~255) * @param {Number} n - 左からn番目 (1~8) * @param {Number} len - 長さ * @return {Number} 0~255 */ const extractBits = (b, n, len = 1) => { if (b < 0 || 255 < b) { throw new RangeError('値は0~255の範囲内で指定してください。'); } if (n < 1 || 8 < n) { throw new RangeError('位置は1~8番目の範囲内で指定してください。'); } if (len < 0 || 8 < (len - 1 + n)) { throw new RangeError('長さがバイトをはみ出してます。'); } let sum = 0; for (let i = 0; i < len; ++i) { const c = 8 - (n + i); sum += ((b & (1 << c)) >> c) << (len - i - 1); } return sum; };通ったテスト// 長さ指定なし console.assert( extractBits(0b00000001, 7) === 0 ); console.assert( extractBits(0b00000001, 8) === 1 ); console.assert( extractBits(0b10000000, 1) === 1 ); console.assert( extractBits(0b10000000, 2) === 0 ); console.assert( extractBits(0b01111110, 1) === 0 ); console.assert( extractBits(0b01111110, 2) === 1 ); console.assert( extractBits(0b01111110, 7) === 1 ); console.assert( extractBits(0b01111110, 8) === 0 ); // 長さ指定あり console.assert( extractBits(0b00110011, 1, 2) === 0b00 ); console.assert( extractBits(0b00110011, 2, 2) === 0b01 ); console.assert( extractBits(0b00110011, 3, 2) === 0b11 ); console.assert( extractBits(0b00110011, 4, 2) === 0b10 ); console.assert( extractBits(0b00110011, 5, 2) === 0b00 ); console.assert( extractBits(0b00110011, 6, 2) === 0b01 ); console.assert( extractBits(0b00110011, 7, 2) === 0b11 ); try { console.assert( extractBits(0b00110011, 7, 2) === false ); } catch (e) { console.assert( e.message === '長さがバイトをはみ出してます。' ); }