自学编程:使用Nodejs实践liveinjs-gbk模块,学习了解JavaScript位运算及应用 (一)

自学编程:使用Nodejs实践liveinjs-gbk模块,学习了解JavaScript位运算及应用 (一)

这个模块的功能: 解决 Node.js GBK 乱码问题, 纯 JS 实现。

原码:

例如, 32位原码 a : 00000000 00000000 00000000 00000001 32 位原码 b: 10000000 00000000 00000000 00000001

真值:

以上两个 32 位原码真值分别为: +1 , -1

a 的反码: a 为正数,补码跟原码相同 b 的反码: 11111111 11111111 11111111 11111110 a 的补码: a 为正数补码与原码相同 b 的补码: 11111111 11111111 11111111 11111111

JavaScript 中的数字都是以 32 位长度存在计算机中的,存储的是数值所对应的补码。 JavaScript 的位运算都是基于数字的补码的。

数字之间,按位与,按位或,按位非,按位异或,都是 32 位补码之间的运算。

liveinjs-gbk 模块 中 编码的转换都是基于位运算的。 liveinjs-gbk 模块地址,有注释: https://www.npmjs.org/package/liveinjs-gbk


5 回复

自学编程:使用Nodejs实践liveinjs-gbk模块,学习了解JavaScript位运算及应用 (一)

引言

在Node.js中处理字符编码问题时,经常会遇到GBK编码的乱码问题。本文将通过liveinjs-gbk模块来解决这一问题,并结合位运算进行深入理解。

模块功能

liveinjs-gbk模块的主要功能是解决Node.js中的GBK乱码问题。该模块完全使用纯JavaScript实现,无需依赖任何外部库。

原码、反码和补码

为了更好地理解位运算,我们先从原码、反码和补码的概念开始。

原码

一个数的原码就是它的二进制表示形式。例如:

  • a: 00000000 00000000 00000000 00000001
  • b: 10000000 00000000 00000000 00000001

真值

原码的真值取决于符号位(最高位):

  • a 的真值为 +1
  • b 的真值为 -1

反码

  • 正数的反码与其原码相同。
  • 负数的反码是其原码的每一位取反(除了符号位)。
// 示例代码
let a = 1; // 原码为 00000000 00000000 00000000 00000001
let b = -1; // 原码为 10000000 00000000 00000000 00000001

console.log(a.toString(2)); // 输出 "1"
console.log(b.toString(2)); // 输出 "-1"

补码

  • 正数的补码与其原码相同。
  • 负数的补码是其反码加1。
// 示例代码
let a = 1; // 补码为 00000000 00000000 00000000 00000001
let b = -1; // 补码为 11111111 11111111 11111111 11111111

console.log(a.toString(2)); // 输出 "1"
console.log((-1).toString(2)); // 输出 "-1"

JavaScript中的位运算

JavaScript中的数字都是以32位长度存储的,存储的是数值的补码。因此,所有的位运算都是基于补码的。

常见的位运算包括:

  • 按位与 (&)
  • 按位或 (|)
  • 按位非 (~)
  • 按位异或 (^)

这些运算都是在32位补码上进行的。

liveinjs-gbk模块

liveinjs-gbk模块利用位运算来实现GBK编码的转换。以下是一个简单的示例代码,展示如何使用该模块进行GBK编码的转换:

const gbk = require('liveinjs-gbk');

// 将字符串转换为GBK编码的Buffer
let str = '你好';
let buffer = gbk.encode(str);

console.log(buffer); // 输出 Buffer

// 将GBK编码的Buffer转换回字符串
let decodedStr = gbk.decode(buffer);
console.log(decodedStr); // 输出 "你好"

总结

通过本文的学习,我们可以了解到liveinjs-gbk模块是如何使用位运算来解决GBK编码问题的。位运算是计算机底层操作的基础,掌握这些知识有助于更深入地理解JavaScript的内部机制。

希望这篇文章能帮助你在自学编程的过程中更好地理解和应用位运算。


得抽时间 玩列markdown,不会。。

帮楼主手动格式化来一遍, 累死我了… 语法参考这里: http://wowubuntu.com/markdown/

跟着我的注释,这个模块弄明白了,编码问题,javascript 位运算运用,基本没问题。

自学编程:使用Nodejs实践liveinjs-gbk模块,学习了解JavaScript位运算及应用 (一)

背景

liveinjs-gbk 模块的主要功能是解决 Node.js 中的 GBK 编码问题。GBK 是一种中文字符编码标准,而 Node.js 默认使用 UTF-8 编码,因此在处理中文时可能会出现乱码问题。这个模块通过纯 JavaScript 实现了 GBK 编码和解码。

原码、反码、补码概念

  • 原码:最简单的二进制表示方式。正数的原码就是其二进制形式,负数的原码是在正数的基础上最高位(符号位)设置为 1。
  • 反码:正数的反码与原码相同,负数的反码是在其原码的基础上将所有位取反。
  • 补码:正数的补码与原码相同,负数的补码是在其反码的基础上加 1。

示例代码

// 定义两个数字 a 和 b
let a = 1; // 32 位原码为 00000000 00000000 00000000 00000001
let b = -1; // 32 位原码为 10000000 00000000 00000000 00000001

// 计算补码
let aBinary = a.toString(2).padStart(32, '0'); // 补码与原码相同
let bBinary = b.toString(2).padStart(32, '0'); // 补码为 11111111 11111111 11111111 11111111

console.log(`a 的补码: ${aBinary}`);
console.log(`b 的补码: ${bBinary}`);

// 位运算
// 按位与 (Bitwise AND)
let andResult = a & b;
console.log(`按位与结果: ${andResult.toString(2).padStart(32, '0')}`);

// 按位或 (Bitwise OR)
let orResult = a | b;
console.log(`按位或结果: ${orResult.toString(2).padStart(32, '0')}`);

// 按位异或 (Bitwise XOR)
let xorResult = a ^ b;
console.log(`按位异或结果: ${xorResult.toString(2).padStart(32, '0')}`);

// 按位非 (Bitwise NOT)
let notResult = ~a;
console.log(`按位非结果: ${notResult.toString(2).padStart(32, '0')}`);

位运算在 liveinjs-gbk 模块中的应用

liveinjs-gbk 模块使用位运算来实现 GBK 编码和解码。这些位运算包括但不限于按位与、按位或、按位异或和按位非等操作,它们用于处理 GBK 字符串的二进制表示。例如,在处理 GBK 编码字符串时,可以通过位运算将字节转换为相应的 Unicode 码点,从而实现字符的正确显示。

通过上述代码示例,我们可以看到位运算在 JavaScript 中的具体实现,并且了解它们在 liveinjs-gbk 模块中的应用。

回到顶部