- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
你如何获得像 -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。如果你想乘或除法,只需使用乘法 (*
) 或除法 (/
) 运算符即可。
一些补充说明:
话虽这么说,我只想添加更多关于位移位的内容以进一步解释(这不会造成伤害):
integer
type can hold positive or negative number0
而另一个会给出 1
unsigned
类型,例如通过位移创建位掩码。也就是说,建议在处理负数(右)位移位时使用 unsigned
以避免符号扩展意外。关于c - 位移 x * 数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35762313/
如果此答案为 Kotlin,我想转换代码:https://stackoverflow.com/a/5402769/2735398 我将其粘贴到 Intellij 中: private int deco
对于这种转变: System.out.println(0b10000000_00000000_00000000_00000001>>>32); 我得到这个输出值: -2147483647 对吗? 最佳
如果没有大量工作,我想要的可能是不可能的,但也许有人有解决方案。我有一个像下面这样的图(这当然是一个过于简单的例子),其中我的刻度标签彼此非常接近: dd <- data.frame(x=1:4, y
试过这个代码on Go playground : package main import ( "fmt" ) func main() { log2Dim := uint32(9)
我希望在用户滚动时获取 UIScrollView 的位移,每次滚动时只需要位移。使用这个方法 -(void)scrollViewWillEndDragging:(UIScrollView *)scro
我正在检查我在装有 iOs 5.1 的 Ipad 中的应用程序当我点击 textarea 时,光标会跳到书写线上方两行。虽然焦点位于正确的位置,但光标的视觉外观出现在焦点线上方两行。对此有任何建议。
你如何获得像 -10 这样的数字?从这些移位练习题中? 据我了解X*32可以写成 x> 1 = 0001 0111 >> 1 = 000 1011 = 11 //right bit-shift by
我正在查看适用于 Linux 的开源 AMD GPU 驱动程序。我注意到一些我以前没有见过的东西,我想知道目的。在sid.h文件的第1441行,有一系列的定义是整数被左移0位。这不就是对原始整数进行操
这个网站 localhotchat.com 有文字从红色栏流出。我试过调整它,但它似乎并没有消失。 主页(和内部)上的 14pt 文本片段应该在 red_colored_strip 内,但它不是,并且
问题#1 在 Java 中,移位是否比使用单个语句将 移位相同数的代价高出数倍? 例如,是 int x = 5; x = x << 16; 比快 int x = 5; for (int i=0; i<
我有三个 Div,周围的 Div 是“MainDiv”,里面的 Top Div 是“UpperDiv”下一个是“FooterDiv”。 在 Mozilla 中一切正常,但在 Chrome 中“Foot
所以,我正在阅读一本关于 Go 的书(Ivo Balbaert 的 The Way to Go),其中有一个代码示例: const hardEight = (1 > 97 因为我没有在这台机器上安装
Android 平台提供了两类动画。 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转、平移、放缩和渐变)。 下面就讲一下Tweene Animations。 主要类:
我有 UINavigationItem,我想向它添加 UISearchBar。我是这样做的: let searchBar = UISearchBar(frame: CGRectMake(0, 0, s
本文实例讲述了Android动画之渐变动画(Tween Animation)。分享给大家供大家参考,具体如下: Android 平台提供了两类动画。 一类是Tween动画,就是对场景里的对象不断的
我在 C# 中使用 openCV 库中的 Lucas Kanade 光流算法;有一系列帧,我想在每两个帧中找出什么是光流并将其显示在图片框中。 我可以从以下函数中获取 velX 和 velY: Emg
我是一名优秀的程序员,十分优秀!