gpt4 book ai didi

c - 位移 x * 数字

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:57 26 4
gpt4 key购买 nike

你如何获得像 -10 这样的数字?从这些移位练习题中?

据我了解X*32可以写成 x<<5 .但是你怎么得到像x*66这样的数字呢? , 或 X*(-10)

最佳答案

一般说明

位移位的主要目的是移动数字的二进制表示形式。它用于乘法。

23 = 0001 0111
23 << 1 = 0001 0111 << 1 = 0010 1110 = 46

However, as the binary representation of a number is changed, the number it represents is also changed. This is just how computer binary system works. And thus people sometimes exploit this behavior as a "hack", mostly to speed up the computation time.

让我们尝试更多地理解它:


左移位和右移位

现在,当表示的数是整数类型时,将一个数的二进制表示向移动1将等同于 2:

23 = 0001 0111
23 << 1 = 0001 0111 << 1 = 0010 1110 = 46 //left bit-shift by 1, number becomes doubled

鉴于给定数据类型没有溢出:

255 = 1111 1111 //assuming 8-bit data type
255 << 1 = 1111 1111 << 1 = 1111 1110 = 254 //not multiplied by 2, because of overflow

虽然将整数向移动相当于将其除以除以 2 然后向下舍入:

23 = 0001 0111
23 >> 1 = 0001 0111 >> 1 = 000 1011 = 11 //right bit-shift by 1, number becomes halved, rounded down

乘法和除法的一些使用和链接

由于位移运算通常比乘法成本更低,为了加快速度,您会在某些程序中看到,当人们打算将其乘以 2 的整数次方(即 2、4、8、16 等):

int a = 23;
...
a = a << 2; //=102; multiply by 4, equivalent to a = a * 4, but faster operation

或者使用右移位运算(代替除法和向下舍入)将其除以2 的整数次幂(即 2、4、8、16 等)

int a = 23;
...
a = a >> 2; //=5; divide by 4 and rounding down, equivalent to integer division a = a / 4, but faster

结束语

请注意,只有当您对数字进行 2 的幂运算时,上面所有的乘法和除法都可以用左移位或右移位代替。

在您的示例中,66 和 -10 不是 2 的幂的整数,因此您不能通过二进制移位运算“破解”乘法/除法。

一般来说,如果你的意思是位移,请使用位移运算,因为位移除了“破解”乘法/除法之外还有许多其他用途,乘法/除法的整数次幂为 2。如果你想乘或除法,只需使用乘法 (*) 或除法 (/) 运算符即可。


一些补充说明:

话虽这么说,我只想添加更多关于位移位的内容以进一步解释(这不会造成伤害):

  • signed integer type can hold positive or negative number
  • 在处理负数时,逻辑位移和算术位移是有区别的。一个会在 shift 后的空白处给出 0 而另一个会给出 1
  • 因此,最好注意位移主要用于unsigned 类型,例如通过位移创建位掩码。也就是说,建议在处理负数(右)位移位时使用 unsigned 以避免符号扩展意外。

关于c - 位移 x * 数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35762313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com