Javascript 如何计算一个32位数字在分块为字节时所需的字节数
因此,我们将32位整数分解为8位块:Javascript 如何计算一个32位数字在分块为字节时所需的字节数,javascript,bit-manipulation,Javascript,Bit Manipulation,因此,我们将32位整数分解为8位块: var chunks = [ (num & 0xff000000) >> 24, (num & 0x00ff0000) >> 16, (num & 0x0000ff00) >> 8, (num & 0x000000ff) ] 在计算块之前,您如何知道它将是多少块?基本上,我想知道它是1、2、3还是4字节,然后再将其分块到数组中。32位整数上的一些位技巧之类的 functio
var chunks = [
(num & 0xff000000) >> 24,
(num & 0x00ff0000) >> 16,
(num & 0x0000ff00) >> 8,
(num & 0x000000ff)
]
在计算块之前,您如何知道它将是多少块?基本上,我想知道它是1、2、3还是4字节,然后再将其分块到数组中。32位整数上的一些位技巧之类的
function countBytes(num) {
// ???
}
根据您的偏好和/或代码库样式,我可以想到几种方法 第一种方法比另一种方法使用更多的分析数学,其性能比下面的逐位数学方法稍差:
//我们需要一个以16为底的对数,因为您使用的是十六进制
const BASE_16=数学日志(16);
常量log16=(num)=>Math.log(num)/BASE_16;
//这是一个函数,它给出了你得到的非零块的数量
const getNumChunks=(num)=>{
//首先,我们获取数字的以16为底的对数,这将给出位置的数量
//你需要在第16班左转才能拿到你的号码。
常量numNonZeroes=Math.round(log16(num));
//我们需要把这个数除以2,因为你要把比特数除以2
const numChunks=Math.ceil(numNonZeroes/2);
返回numChunks;
}
第二个是严格按位的:
const getNumChunks=(num)=>{
设探头=0xff;
设numChunks=0;
while((probe&num)| | num>probe){
probe=probe根据您的偏好和/或代码库样式,我可以想到几种方法
第一种方法比另一种方法使用更多的分析数学,其性能比下面的逐位数学方法稍差:
//我们需要一个以16为底的对数,因为您使用的是十六进制
const BASE_16=数学日志(16);
常量log16=(num)=>Math.log(num)/BASE_16;
//这是一个函数,它给出了你得到的非零块的数量
const getNumChunks=(num)=>{
//首先,我们获取数字的以16为底的对数,这将给出位置的数量
//你需要在第16班左转才能拿到你的号码。
常量numNonZeroes=Math.round(log16(num));
//我们需要把这个数除以2,因为你要把比特数除以2
const numChunks=Math.ceil(numNonZeroes/2);
返回numChunks;
}
第二个是严格按位的:
const getNumChunks=(num)=>{
设探头=0xff;
设numChunks=0;
while((probe&num)| | num>probe){
probe=probe或此单行程序使用clz32
函数确定使用了32位无符号整数的多少字节
function numOfBytes( x ) {
return x === 0 ? 1 : (((31 - Math.clz32( x )) / 8) + 1) | 0;
}
或者,这个单行程序使用clz32
函数来确定32位无符号整数的字节数
function numOfBytes( x ) {
return x === 0 ? 1 : (((31 - Math.clz32( x )) / 8) + 1) | 0;
}
我想你可以检查一下num,我想你可以检查一下num