鉴于以下函数用 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);
}
因为我不需要二进制表示的字符串。
答案 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!虽然你必须事先知道这件事有多大。