首页 > 解决方案 > 左右移位的目的是什么

问题描述

我知道左移和右移是做什么的

当我有 0011 >> 1 右移时,它将是 → 0001

如果我们使用 0011 >> 2它只是将值2除以 4 等等...但是我刚开始使用 tcp 套接字的目的是什么,我看到我们发送的缓冲区大小是这样的

   var bytes = new Array(4)
   bytes[1] = int >> 24
   bytes[2] = int >> 16
   bytes[3] = int >> 8
   bytes[4] = int

我不知道为什么我们使用 24 和 16 和 8

有时他们只使用8喜欢

var bytes = new Array(2) 
   bytes[1] = int >> 8
   bytes[2] = int

再次,当他们想读取大小时,他们只是使用与使用相反的right shift方法left shift

size = buff[1] << 24 | buff[2] << 16 | buff[3] << 8 | buff[4]

在发送值之前使用右移的目的是什么,当使用左移接收它时为什么不直接发送它?

标签: c#

解决方案


因为如果你想象使用这些比特,它会让生活更轻松

Anint在内存中是 4 字节大,因此要将其作为四个单独byte的 s,我们可以将其移动

some int: 11111111 10101010 11110000 11001100

为了得到这些位块和 4 个单独的字节,我们当然可以除以 2 的幂,但它比仅仅将整个东西向右滑动 24 个位置留下11111111我们存储在一个字节中(所有从右手滑落的东西)更难想象边丢失)..或向右滑动 16 位离开11111111 10101010,然后11111111当我们将其存储在一个字节中时将其切断(分配给一个字节时,最右边 8 位左侧的所有内容都会丢失)

这有点像用比特玩Stacker

至于为什么你可以使用左移来从 4 个字节重构一个 int - 想象一下你有 32 个插槽排列成 4 组的堆栈器的反向版本,你必须将这8 位(从前导字节)放入最左边的桶中,然后将后续字节的位放入下一个桶中:

some byte:                            11111111
next byte:                            10101010

some int:  ________ ________ ________ ________

“某个字节”需要向左滑动 24 位,下一个字节向左滑动 16 位。结果,它们获取 0(变为仅设置了一些位的整数):

some byte shifted: 11111111 00000000 00000000 00000000
next byte shifted:          10101010 00000000 00000000

some int result:   ________ ________ ________ ________

然后将它们按位或一起产生结果:

some byte: 11111111 00000000 00000000 00000000
next byte: 00000000 10101010 00000000 00000000

some int:  11111111 10101010 00000000 00000000

OR是“逐列工作,如果列中的任何值为1,则列中的结果值为1,否则为0”


为什么这些事情总是以字节的形式完成?

因为这就是网络传输的方式,因为一切最终都是一个字节(一个 int 是 4 个字节),或者如果你想这样看的话,就是比特。即使您使用一些将 int 写入套接字的抽象,它也会将其转换为字节。在这里,您只是对这种转换的结果有所了解(而且不必一定是这种方式;还有其他排列位和字节的方法。只要您保持一致,无论您如何做)


您还可以看到它用于标志枚举之类的东西:

flags enum Perms{
  None = 0,
  Read = 1 << 0,
  Write = 1 << 1,
  Delete = 1 << 2
}

这也可以通过

flags enum Perms{
  None = 0,
  Read = 2^0,
  Write = 2^1,
  Delete = 2^2
}
  

没有人会因为 bitshift 版本而解雇你,尽管作为操作,它们比 powers 更不常见,所以下一个维护代码的人可能需要查看它的含义,而 power 形式可能已经很好理解了

至于它们是如何产生的,移位操作通常也比乘法/除法操作快得多(它们对于 CPU 来说实现起来非常简单,但应用有限),因此对于有限的上下文非常有用


推荐阅读