在TypeScript中翻译c ++函数

时间:2017-03-12 13:12:07

标签: c++ typescript operators bit

鉴于以下函数 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);
}

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

1 个答案:

答案 0 :(得分:1)

字符串在这里不是一个好的存储空间。顺便说一句,JS Strings使用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);

适用于两者,但是:

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

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

但如果性能是主题,请使用Typed Arrays!虽然你必须事先知道这件事有多大。