【问题标题】:Assigning values with bitwise and operator使用按位和运算符赋值
【发布时间】:2019-11-13 20:37:54
【问题描述】:

我意识到这是非常琐碎的事情,但我无法理解它。

假设我正在使用this message. 这是一个 3 字消息,每个字 16 位。如果我试图编写进行这些变量赋值的伪代码,这是否正确:

var1 = (word 1) & 0x7FFF

tmp1 = (word 1 >> 15) & 0x0001
tmp2 = (word 2 & 0x3FFF) << 14
var2 = tmp1 + tmp2    

tmp1 = (word 2 >> 14) & 0x0003
tmp2 = (word 3 & 0x7FFF) << 15
var3 = tmp1 + tmp2

【问题讨论】:

  • 取决于你想做什么。如果第 1 字的第 15 位保留在第 15 位,那么您不应该将其移回第 0 位。但您的目标又是什么?
  • @broch 我想要的是每个变量都具有以下属性: var1:15 位字段,在字 1 上找到,LSB 位位置 0,MSB 位位置 14 var2:15 位字段,找到在字 1 和 2 上,字 1 的 LSB 位位置 15,字 2 的 MSB 位位置 13 var3:17 位字,在字 2 和 3,LSB 位位置 14 字 7,MSB 位位置 14 字 3 上找到 这是当你问我的目标是什么时,你的意思是什么?最终,我只需要将消息中的这些数据分配给这三个变量。

标签: bit-manipulation bitwise-operators pseudocode bit-shift bitwise-and


【解决方案1】:

不,它没有将来自word2 的位放在var2 的正确位置,也没有将来自word3 的位放在var3 的正确位置,如图所示:

0 is a 0 bit,
1 comes from word1
2 comes from word2
3 comes from word3
var1 =     0111 1111 1111 1111 (good)
var2 = ... 2200 0000 0000 0001 (not good)
var3 = ... 3000 0000 0000 0022 (not good)

中间不应有大段的零。

额外的零在那里是因为向左的移位太大了。应该是:

var1 = (word 1) & 0x7FFF

tmp1 = (word 1 >> 15) & 0x0001
tmp2 = (word 2 & 0x3FFF) << 1
var2 = tmp1 + tmp2    

tmp1 = (word 2 >> 14) & 0x0003
tmp2 = (word 3 & 0x7FFF) << 2
var3 = tmp1 + tmp2

【讨论】:

  • 感谢您的快速回复。所以问题在于左移——我应该在前一个单词中移动所需变量的位数。
  • @synchh 是的,完全正确,或者在更复杂的情况下(例如,如果一个变量分布在 3 个字上),它将是“它之前的位数”
  • 谢谢,最后一件事。它之前的位数,回到字边界,还是前一个字段?
  • @synchh 一直返回到变量的开头(否则移位计数将定期“重置”,并使位“相互碰撞”)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 2015-10-24
  • 1970-01-01
  • 2013-06-28
  • 2015-03-19
  • 2021-08-10
  • 1970-01-01
相关资源
最近更新 更多