>>按位移位(swift 3)<<

高级运算符“ <>”用于快速将整数位移位给定的次数。 向右移一点具有将整数减半的效果,而向左移则使整数加倍。 例如:

  //右移 
让example1 = 8 >> 1 // example1 == 4
让example2 = 8 >> 2 // example2 == 2
  //向左移动 
让example3 = 8 << 1 // example3 == 16
让example4 = 8 << 2 // example4 == 32

要了解移位的情况,我们首先需要了解整数如何用二进制表示。 在此示例中,我将使用一个无符号的8位整数来演示其工作原理。

了解UInt8

我在示例中使用的是UInt8,因为它很容易理解,因为我们不处理负数和仅8位。

注意 :拥有带符号的整数基本上意味着二进制签名中的一位被用来表示整数是正数还是负数。 意味着我们只剩下7个位来定义一个数字。 这使移位变得更加复杂。 在无符号整数中,所有8位都可用于定义数字。

用8位数字表示一个数字意味着我们可以表示256种不同的可能性(0–255)。

  0 = 00000000 2 = 00000010 4 = 00000100 8 = 00001000 
1 = 00000001 3 = 00000011 5 = 00000101 9 = 00001001
6 = 00000110 10 = 00001010
7 = 00000111 11 = 00001011
12 = 00001100
13 = 00001101
14 = 00001110
15 = 00001111

  16 = 00010000 
...
32 = 00100000
...
64 = 01000000
...
128 = 10000000
...
255 = 11111111

我不会写出所有256个表示形式,但是您应该在这里看到一个模式。 在每列的开头,2、4、8、16、32、64和128代表需要另外一位的位置。 请注意,序列中的每个数字都是前一个数字的两倍。 一旦我们达到255,我们将需要第9位来表示数字256…因此,在这种情况下,这是UInt8可以表示的最高数字。

按位移位

现在,让我们看一下使用这些数字之一的按位移位。

对于每个移位,请想象8位序列中的所有位都被移了一个空格。 想象一下,这些位子坐在桌子上,但其中只有8个空间。 如果我们将它们向右推,则最右边的位将从桌子上掉下来,桌子的左侧现在将有一个空白空间。 那个空白被零填充,我们有了新的价值。

  let num = 8 // 00001000 
  let shiftedNum = num >> 1 // 00000100 0 
^^
插入0 0碰掉
  // shiftedNum = 4 00000100 

如果我们向左移动,该值将增加一倍

  let num = 8 // 00001000 
  let shiftedNum = num << 1 // 0 00010000 
^^
0撞掉插入0
  // shiftedNum = 16 // 00010000 

这里有几个例子!

  let num = 25 < 01100100,num == 100 
  let num2 = 30 >> 5 // 00011110(向右移5)> 00000000,num2 == 0 

要注意的一种情况是,如果移位导致该值超过255,我们将看到一些意外的结果。 因为只有8位,所以我们不能加9来使值大于256。假设我们将200左移一次,希望将其加倍,这就是结果。

  let num = 200 < 10010000,num == 144 

同样不是说右移可以发生很多次……但是当您达到零时,其余的移位将保持为零。

  let num = 10 >> 10 // 00001010(向右移10)> 00000000,num == 0 

使用移位在颜色十六进制代码中查找RGB值

这是一个更实际,更复杂的示例,说明按位移位如何有用。 了解此解决方案需要我们对十六进制表示法有所了解。

十六进制是一个以16为底的数字系统(十进制是10的底数)。 我们可以使用4位很好地表示数字0–15。

快速地,使用十六进制表示法给我们一个整数,但是当我们使用十六进制表示法来获得颜色的红色,绿色和蓝色值时,我们需要能够从单个整数中分离出3个数字。 让我们在颜色编辑器中查看颜色并将其分解。

我们用以下值表示黄色。

 红色= 255 
蓝色= 193
绿色= 7
 十六进制颜色#= FFC107 

但是,如果我们仅提供十六进制代码作为输入,则只会看到一个大整数。

因此,我们需要做的是以某种方式隔离FF,C1和07。首先让我们看一下此十六进制代码的二进制文件。

  FFC 1 0 7 
1111 1111 1100 0001 0000 0111

使用&运算符,我们可以有效地用0掩盖十六进制的任何部分。 &运算符的工作方式是比较2个二进制签名,并且在两个二进制签名都具有一个的地方,都维护一个–在有零的位置,则保持零。 这可能有助于可视化

 让isolatedGreenValue = 0xFFC107和0x00FF00 
  FFC 1 0 7 
1111 1111 1100 0001 0000 0111
  0 0 FF 0 0 
0000 0000 1111 1111 0000 0000
  = 
  0 0 C 1 0 0 
0000 0000 1100 0001 0000 0000

现在,我们几乎已经确定了绿色价值。 只有使用&运算符,我们才能隔离该值,但现在我们需要对其进行移位! 您能猜出我们需要多少次移向哪个方向?

  0 0 C 1 0 0 
0000 0000 1100 0001 0000 0000
  >> 8 
  = 
  0 0 0 0 C 1 
0000 0000 0000 0000 1100 0001

由于如果将c1的右边移位8次,则它的右边有8位,我们将获得绿色值! (与上面的屏幕截图中的绿色值相同)

希望您已经找到了这篇信息丰富的文章! 这是完成的函数,显示了如何使用&运算符和位移位从十六进制颜色代码中获取RGB值。

感谢您阅读🙂