在解码 Javascript 中的位掩码标志方面需要帮助
Need help in decoding Bitmask flags in Javascript
此处为按位运算符初学者。我了解它们之间的区别,但是我无法正确解码它们的用户语言。基本上后端给了我一个数字,我需要用它来解码用户语言。
static const int TlvLanguageMask = 0x0700;
static const int TlvEnglish = 0x0000;
static const int TlvFrench = 0x0100;
static const int TlvSwedish = 0x0200;
static const int TlvCzech = 0x0300;
static const int TlvGerman = 0x0400;
static const int TlvSpanish = 0x0500;
static const int TlvItalian = 0x0600;
static const int TlvRomanian = 0x0700;
这是用 C++ 编写的后端用于设置语言的内容。在我用 Javascript 编写的前端中,我做了以下事情:
function decodeLanguagevalue(Languagecode){
let language;
const languages={
languagemask:1792,//1110 0000 000
english:0,//0
french:128<<1,//256 -->1000 0000 0
swedish:128<<2,//512-->1000 0000 00
czech:512^256,//768 -->1100 0000 00 french+swedish?
German:128<<3,//1024-->1000 0000 000
Spanish:1024^256,//1280-->1010 0000 000 german+french?
Italian:1280^256,//1536--> 1100 0000 000 spanish+french?
Romanian:1536^256//1792--> 1110 0000 000 italian+french?
}
switch (Languagecode) {
case Languagecode & languages.english:
language="UK"
break;
case Languagecode & languages.french:
language="French"
break;
case Languagecode & languages.swedish:
language="Swedish"
break;
case Languagecode & languages.french & languages.swedish:
language="CZech"
break;
case Languagecode & languages.German:
language="German"
break;
case Languagecode & languages.German & languages.french:
language="Spanish"
break;
case Languagecode & languages.Spanish & languages.french:
language="Italian"
break;
case Languagecode & languages.Italian & languages.french:
language="Romanian"
break;
default:
language="Unknown"
break;
}
return language
}
然而这个功能总是returns我不知道。这基本上意味着我搞砸了 frontend.Can 上的按位运算符有人启发我并帮助我正确解码它们吗?谢谢
编辑 23/05
function decodeLanguagevalue(Languagecode){
let language;
const languages={
languagemask:0x0700,//1110 0000 000 //0x0700
english:0x0000,//0 //0x0000
french:0x0100,//256 -->1000 0000 //0x0100
swedish:0x0200,//512-->1000 0000 00 //0x0200
czech:0x0300,//768 -->1100 0000 00 //0x0300
German:0x0400,//1024-->1000 0000 000 //0x0400
Spanish:0x0500,//1280-->1010 0000 000 //0x0500
Italian:0x0600,//1536--> 1100 0000 000 //0x0600
Romanian:0x0700//1792--> 1110 0000 000 //0x0700
}
if((Languagecode & languages.english)==languages.english){
language='English'
}
if((Languagecode & languages.french)==languages.french){
language='French'
}
if((Languagecode & languages.swedish)==languages.swedish){
language='Swedish'
}
if((Languagecode & languages.czech)==languages.czech){
language='Czech'
}
if((Languagecode & languages.German)==languages.German){
language='German'
}
if((Languagecode & languages.Spanish)==languages.Spanish){
language='Spanish'
}
if((Languagecode & languages.Italian)==languages.Italian){
language='Italian'
}
if((Languagecode & languages.Romanian)==languages.Romanian){
language='Romanian'
}
language===undefined ? language='unknown' : language
return language
}
所提供的代码将 Languagecode 编码为位掩码和 0 到 7 范围内的数值的组合。(请注意,在二进制中,范围是 000b 到 111b。)因此,位掩码用于将语言代码减少到仅感兴趣的 3 个二进制数字。然后,您只需根据 Languagecode 值检查结果。
因此,在客户端,代码将显示为...
const TlvLanguageMask = 0x0700;
const TlvEnglish = 0x0000;
const TlvFrench = 0x0100;
o
o
o
const TlvRomanian = 0x0700;
function decodeLanguagevalue( Languagecode ) {
let language = 'Unknown';
switch ( Languagecode & TlvLanguageMask ) {
case TlvEnglish:
language = 'English';
break;
case TlvFrench:
language = 'French';
break;
o
o
o
case TlvRomanian:
language = 'Romanian';
break;
}
return language;
}
你的 switch...case
语句的问题是它检查 Languagecode
等于 Languagecode & languages.english
,只有当 languages.english
有 至少 Languagecode
拥有的所有 1 位,但如果 Languagecode
还包括 non-language 相关位(在语言掩码范围之外),这永远不可能是真的. switch
语句的其他 case
部分也会发生同样的情况...
我会这样做:
const languages = ["English", "French", "Swedish", "Czech", "German", "Spanish", "Italian", "Romanian"];
function decodeLanguagevalue( code ) {
const languageId = (code >> 8) & 7; // get the three bits of interest in the lowest bits
return languages[languageId];
}
说明
最初,语言 ID 编码为以下整数中标记为 *
的三位(二进制表示形式——这对应于您的 languagemask
):
???? ?*** ???? ????
问号表示我们在查找语言时不感兴趣的部分。因此,我们首先“删除”我们感兴趣的右侧的位。我们可以使用 right-shift 运算符 (>>
) 将它们移出。如果我们移动一次,我们会得到这个:
0??? ??** *??? ????
───────────────────>>
请注意在左侧 在 中如何移动一个零,而在右侧 ?
如何 掉落 .
如果我们继续移动(最多 8 次),我们会得到:
0000 0000 ???? ?***
───────────────────>>
由于我们对左侧的 ?
部分也不感兴趣,我们也将它们踢掉,方法是对 0111:
应用 bit-wise AND 运算
0000 0000 ???? ?***
0000 0000 0000 0111
─────────────────── AND
0000 0000 0000 0***
所以现在我们已经提取了感兴趣的三位,它们位于最低有效位。这很好,因为现在数字的 value 介于 0 和 7(含)之间。这可以用作字符串数组中的索引。
此处为按位运算符初学者。我了解它们之间的区别,但是我无法正确解码它们的用户语言。基本上后端给了我一个数字,我需要用它来解码用户语言。
static const int TlvLanguageMask = 0x0700;
static const int TlvEnglish = 0x0000;
static const int TlvFrench = 0x0100;
static const int TlvSwedish = 0x0200;
static const int TlvCzech = 0x0300;
static const int TlvGerman = 0x0400;
static const int TlvSpanish = 0x0500;
static const int TlvItalian = 0x0600;
static const int TlvRomanian = 0x0700;
这是用 C++ 编写的后端用于设置语言的内容。在我用 Javascript 编写的前端中,我做了以下事情:
function decodeLanguagevalue(Languagecode){
let language;
const languages={
languagemask:1792,//1110 0000 000
english:0,//0
french:128<<1,//256 -->1000 0000 0
swedish:128<<2,//512-->1000 0000 00
czech:512^256,//768 -->1100 0000 00 french+swedish?
German:128<<3,//1024-->1000 0000 000
Spanish:1024^256,//1280-->1010 0000 000 german+french?
Italian:1280^256,//1536--> 1100 0000 000 spanish+french?
Romanian:1536^256//1792--> 1110 0000 000 italian+french?
}
switch (Languagecode) {
case Languagecode & languages.english:
language="UK"
break;
case Languagecode & languages.french:
language="French"
break;
case Languagecode & languages.swedish:
language="Swedish"
break;
case Languagecode & languages.french & languages.swedish:
language="CZech"
break;
case Languagecode & languages.German:
language="German"
break;
case Languagecode & languages.German & languages.french:
language="Spanish"
break;
case Languagecode & languages.Spanish & languages.french:
language="Italian"
break;
case Languagecode & languages.Italian & languages.french:
language="Romanian"
break;
default:
language="Unknown"
break;
}
return language
}
然而这个功能总是returns我不知道。这基本上意味着我搞砸了 frontend.Can 上的按位运算符有人启发我并帮助我正确解码它们吗?谢谢
编辑 23/05
function decodeLanguagevalue(Languagecode){
let language;
const languages={
languagemask:0x0700,//1110 0000 000 //0x0700
english:0x0000,//0 //0x0000
french:0x0100,//256 -->1000 0000 //0x0100
swedish:0x0200,//512-->1000 0000 00 //0x0200
czech:0x0300,//768 -->1100 0000 00 //0x0300
German:0x0400,//1024-->1000 0000 000 //0x0400
Spanish:0x0500,//1280-->1010 0000 000 //0x0500
Italian:0x0600,//1536--> 1100 0000 000 //0x0600
Romanian:0x0700//1792--> 1110 0000 000 //0x0700
}
if((Languagecode & languages.english)==languages.english){
language='English'
}
if((Languagecode & languages.french)==languages.french){
language='French'
}
if((Languagecode & languages.swedish)==languages.swedish){
language='Swedish'
}
if((Languagecode & languages.czech)==languages.czech){
language='Czech'
}
if((Languagecode & languages.German)==languages.German){
language='German'
}
if((Languagecode & languages.Spanish)==languages.Spanish){
language='Spanish'
}
if((Languagecode & languages.Italian)==languages.Italian){
language='Italian'
}
if((Languagecode & languages.Romanian)==languages.Romanian){
language='Romanian'
}
language===undefined ? language='unknown' : language
return language
}
所提供的代码将 Languagecode 编码为位掩码和 0 到 7 范围内的数值的组合。(请注意,在二进制中,范围是 000b 到 111b。)因此,位掩码用于将语言代码减少到仅感兴趣的 3 个二进制数字。然后,您只需根据 Languagecode 值检查结果。
因此,在客户端,代码将显示为...
const TlvLanguageMask = 0x0700;
const TlvEnglish = 0x0000;
const TlvFrench = 0x0100;
o
o
o
const TlvRomanian = 0x0700;
function decodeLanguagevalue( Languagecode ) {
let language = 'Unknown';
switch ( Languagecode & TlvLanguageMask ) {
case TlvEnglish:
language = 'English';
break;
case TlvFrench:
language = 'French';
break;
o
o
o
case TlvRomanian:
language = 'Romanian';
break;
}
return language;
}
你的 switch...case
语句的问题是它检查 Languagecode
等于 Languagecode & languages.english
,只有当 languages.english
有 至少 Languagecode
拥有的所有 1 位,但如果 Languagecode
还包括 non-language 相关位(在语言掩码范围之外),这永远不可能是真的. switch
语句的其他 case
部分也会发生同样的情况...
我会这样做:
const languages = ["English", "French", "Swedish", "Czech", "German", "Spanish", "Italian", "Romanian"];
function decodeLanguagevalue( code ) {
const languageId = (code >> 8) & 7; // get the three bits of interest in the lowest bits
return languages[languageId];
}
说明
最初,语言 ID 编码为以下整数中标记为 *
的三位(二进制表示形式——这对应于您的 languagemask
):
???? ?*** ???? ????
问号表示我们在查找语言时不感兴趣的部分。因此,我们首先“删除”我们感兴趣的右侧的位。我们可以使用 right-shift 运算符 (>>
) 将它们移出。如果我们移动一次,我们会得到这个:
0??? ??** *??? ????
───────────────────>>
请注意在左侧 在 中如何移动一个零,而在右侧 ?
如何 掉落 .
如果我们继续移动(最多 8 次),我们会得到:
0000 0000 ???? ?***
───────────────────>>
由于我们对左侧的 ?
部分也不感兴趣,我们也将它们踢掉,方法是对 0111:
0000 0000 ???? ?***
0000 0000 0000 0111
─────────────────── AND
0000 0000 0000 0***
所以现在我们已经提取了感兴趣的三位,它们位于最低有效位。这很好,因为现在数字的 value 介于 0 和 7(含)之间。这可以用作字符串数组中的索引。