在 TypeScript 中翻译 c++ 函数

Translate c++ functions in TypeScript

给定以下函数 C++ 编写:

#define getbit(s,i) ((s)[(i)/8] & 0x01<<(i)%8)
#define setbit(s,i) ((s)[(i)/8] |= 0x01<<(i)%8)

如何将它们转换为兼容的 TypeScript 函数?

我想到了:

function setbit(s: string, i: number): number {
    return +s[i / 8] | 0x01 << i % 8;
}

function getbit(s: string, i: number): number {
   return +s[i / 8] & 0x01 << i % 8;
}

我发现 a |= b 等价于 a = a | b,但我不确定 getbit 函数的实现。另外,我真的不明白这些功能应该做什么。有人可以解释一下吗?

谢谢。

编辑:

使用@Thomas 的想法,我最终这样做了:

function setBit(x: number, mask: number) {
    return x | 1 << mask;
}

// not really get, more like a test
function getBit(x: number, mask: number) {
    return ((x >> mask) % 2 !== 0);
}

因为我真的不需要二进制表示的字符串。

字符串在这里不是很好的存储方式。顺便说一句,JS 字符串使用 16 位字符,所以你只使用了 1/256 的存储空间。

function setbit(string, index) {
    //you could do `index >> 3` but this will/may fail if index > 0xFFFFFFFF
    //well, fail as in produce wrong results, not as in throwing an error.
    var position = Math.floor(index/8), 
        bit = 1 << (index&7),
        char = string.charCodeAt(position);
    return string.substr(0, position) + String.fromCharCode(char|bit) + string.substr(position+1);
}

function getbit(string, index) {
    var position = Math.floor(i/8),
        bit = 1 << (i&7),
        char = string.charCodeAt(position);
    return Boolean(char & bit);
}

最好是(类型化的)数组。

function setBit(array, index){
    var position = Math.floor(index/8),
        bit = 1 << (index&7);
    array[position] |= bit; //JS knows `|=` too
    return array;
}

function getBit(array, index) {
    var position = Math.floor(index/8),
        bit = 1 << (index&7);
    return Boolean(array[position] & bit)
}

var storage = new Uint8Array(100);
setBit(storage, 42);
console.log(storage[5]);

var data = [];
setBit(data, 42);
console.log(data);

两者都适用,但是:

  • 所有类型的数组都有固定长度,在内存分配(创建)后不能更改。

  • 常规数组没有常规类型,例如 8 位/索引左右,限制为 53 位浮点数,但出于性能原因,您应该坚持使用最多 INT31(31,而不是 32) ,这意味着 30 位 + 符号。在这种情况下,JS 引擎可以在幕后稍微优化一下;减少内存影响并且速度更快。

但如果性能是主题,请使用类型化数组!虽然你得提前知道这个东西能弄到多大。