在解码 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(含)之间。这可以用作字符串数组中的索引。