问题标签 [bit-shift]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
20581 浏览

c# - 何时在 C# 中使用 Shift 运算符 << >>?

我正在研究 C# 中的移位运算符,试图找出何时在我的代码中使用它们。

我找到了答案,但对于 Java,您可以:

a) 进行更快的整数乘除运算:

*4839534 * 4* 可以这样完成: 4839534 << 2

或者

543894 / 2可以这样完成:543894 >> 1

对于大多数处理器来说,移位操作比乘法快得多。

b) 将字节流重组为 int 值

c) 用于加速图形操作,因为红色、绿色和蓝色由单独的字节编码。

d) 将小数字打包成一个长...


对于 b、c 和 d,我无法想象这里有一个真实的样本。

有谁知道我们是否可以在 C# 中完成所有这些项目?C#中的移位运算符有更多实际用途吗?

0 投票
3 回答
1879 浏览

java - >>> 和 >> 运算符之间的区别

如果移位的数字是正数 >>> 和 >> 工作相同。

如果移位数为负数 >>> 用 1 填充最高有效位,而 >> 操作移位用 0 填充 MSB。

我的理解正确吗?

如果负数存储时将 MSB 设置为 1 而不是 Java 使用的 2s 补码方式,则运算符的行为将完全不同,对吗?

0 投票
1 回答
560 浏览

bit-shift - 在 Maxima 中使用位移运算求解方程

我有一些复杂的方程式,我想用 Maxima 来评估。

在解决方案过程的一个步骤中,我将寄存器拆分为最重要和最不重要的组件,因此我需要能够在 Maxima 中做到这一点。

我试过用load(functs),不,谢谢。

0 投票
3 回答
771 浏览

java - Java 位移怪异

Java 有 2 个用于右移的移位运算符:

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html

这看起来相当简单,所以任何人都可以向我解释为什么当给 bar 的值为 -128 时,这段代码会为 foo 生成 -2 的值:

这样做的目的是取一个 8 位字节,掩码最左边的 2 位,并将它们移到最右边的 2 位。IE:

结果实际上是-2,即

IE。1s 而不是 0s 被移到左边的位置

0 投票
2 回答
27221 浏览

java - 按位移位运算符。已签名和未签名

我正在使用互联网上的补习笔记练习 SCJP 考试。

根据我的笔记,>>操作符应该是右移符号,符号位是从左边引入的。而左移运算符<<应该保留符号位。

但是,我可以使用<<运算符移动符号(feInteger.MAX_VALUE << 1评估为-2,而我永远无法使用>>运算符移动符号。

我一定是在这里误解了一些东西,但是什么?

0 投票
3 回答
817 浏览

php - PHP Left Shift 在两台不同的机器上给出两个答案

我对 PHP 的左移函数的行为感到非常困惑。我在两台不同的机器(开发和托管)上使用它,它们给了我不同的答案。我已经追踪到这个计算:

(-3941404251) << 5;

在一台机器上,我得到了答案-1570884448;另一方面,我得到 0。在两个系统上,PHP_INT_MAX = 2147483647。后者是 32 位系统,第一个是 64 位系统,尽管 php 作为 32 位进程运行并且仍然给出相同的答案。

我只能假设这是 32 位与 64 位的问题,但有没有简单的方法来获得所需的行为。如果有人可以向我指出一个功能或其他东西,那就太好了。

谢谢!

0 投票
3 回答
1909 浏览

java - 像 C#/Java 这样的高级语言屏蔽位移计数操作数的原因是什么?

这更像是一个语言设计而不是一个编程问题。

以下是JLS 15.19 Shift Operators的摘录:

如果左侧操作数的提升类型是int,则仅将右侧操作数的五个最低位用作移位距离。

如果左侧操作数的提升类型是long,则仅将右侧操作数的最低六位用作移位距离。

这种行为也在C# 中指定,虽然我不确定它是否在 Javascript 的官方规范中(如果有的话),但至少根据我自己的测试也是如此。

结果是以下情况为真:

我知道这个规范可能是受到以下事实的“启发”:底层硬件在移动 32 位值(64 位时需要 6 位)时,计数操作数只需要 5 位,我可以理解在例如 JVM 级别,但为什么 C# 和 Java 等高级语言会保留这种相当低级的行为呢?他们不应该提供超越硬件实现的更抽象的视图并更直观地表现吗?(如果他们可以采用负数来表示转向另一个方向,那就更好了!)

0 投票
1 回答
436 浏览

c# - C# 位移:​​规范中的这种行为、错误还是偶然的?

我正在使用位移运算符(请参阅我的问题Bit Array Equality)并且一个 SO 用户指出了我计算移位操作数时的一个错误——我计算的范围是 [1,32] 而不是 [0,31]一个整数。(为 SO 社区欢呼!)

在解决问题时,我惊讶地发现以下行为:

事实上,它似乎n << s被编译(或由 CLR 解释——我没有检查 IL),n << s % bs(n)其中 bs(n) = n 的大小,以位为单位。

我本来期望:

编译器似乎意识到您正在超出目标的大小并纠正您的错误。

这纯粹是一个学术问题,但有谁知道这是否在规范中定义(我在7.8 Shift 运算符中找不到任何东西),只是未定义行为的偶然事实,或者是否存在可能产生错误的情况?

0 投票
5 回答
855 浏览

algorithm - 用位移操作替换分支语句

我正在编写一个图像二值化算法,它只是将每个像素的亮度值(灰度图像)转换为黑色或白色。目前对每个像素进行二值化的算法大致是这样的

(这实际上是 ACTUAL 算法的简化,因为双色调图像实际上是一个位压缩图像(每个数组索引包含 8 个像素)所以我实际上将 1 位压缩到当前数组索引中......但我不认为这会改变我的问题。

我正在尝试做的是消除对 if 语句的需要。

我的想法是按照这个思路做一些事情。用灰度减去 thresholdValue,然后执行一些位操作技巧来清除或移位位,这样如果(grayscale[x]-threshold) is less than 0, I get a 0. otherwise I would get a 1. 如果以另一种方式更容易做到这(if grayscale[x]-threshold < 0 + bitwise trickery get a 1, else get a 0)一点也可以工作......只要我可以摆脱分支语句......任何帮助表示赞赏..

0 投票
5 回答
365 浏览

c# - 为什么仅在某些事件中算术移位一半?

嘿,我正在自学按位,我在互联网的某个地方看到了算术移位(>>)一个数字的二分之一。我想测试它:

另一个例子:

谢谢。