Tag: 位操作

按位(&)如何在Java中工作?

我正在阅读一些代码示例,并在他们的Bitwise和Bit Shift Operators页面上find了Oracle的网站。 在我看来,解释这个按比例的工作做得不太好。 我明白,它直接做了一个操作的位,但我只是不知道什么样的操作,我想知道那是什么操作。 以下是我从Oracle网站下载的示例程序: http : //docs.oracle.com/javase/tutorial/displayCode.html?code=http : //docs.oracle.com/javase/tutorial/java/nutsandbolts/实例/ BitDemo.java

最快的方法来钳制一个真正的(固定/浮点)值?

有没有比使用if语句或三元运算符更有效的方法来限制实数? 我想为双打和32位定点执行(16.16)做这个。 我不是要求可以处理这两种情况的代码; 他们将被分开处理。 显然,我可以做一些事情: double clampedA; double a = calculate(); clampedA = a > MY_MAX ? MY_MAX : a; clampedA = a < MY_MIN ? MY_MIN : a; 要么 double a = calculate(); double clampedA = a; if(clampedA > MY_MAX) clampedA = MY_MAX; else if(clampedA < MY_MIN) clampedA = MY_MIN; 固定点版本将使用函数/macros进行比较。 这是在代码的性能关键部分完成的,所以我正在寻找一种尽可能高效的方式来做到这一点(我怀疑会涉及位操作) 编辑:它必须是标准/便携式C,特定于平台的function在这里没有任何利益。 而且, […]

按位运算符实现分割

我怎样才能使用按位运算符来实现分割(不仅仅是2的幂)? 详细描述。

SIMD使用无符号乘法对64位* 64位到128位进行签名

我创build了一个使用SIMD 64位* 64位到128位的函数。 目前我已经使用SSE2(强大的SSE4.1)来实现它。 这意味着它同时执行两个64b * 64b到128b的产品。 同样的想法可以扩展到AVX2或AVX512同时提供四个或八个64b * 64到128b产品。 我基于我的algorithm在http://www.hackersdelight.org/hdcodetxt/muldws.c.txt 该algorithm执行一个无符号乘法,一个有符号乘法和两个有符号*无符号乘法。 使用_mm_mul_epi32和_mm_mul_epu32可以很容易地执行带符号的*无符号*无符号操作。 但混合签名和未签名的产品给我带来了麻烦。 考虑一下例子。 int32_t x = 0x80000000; uint32_t y = 0x7fffffff; int64_t z = (int64_t)x*y; 双字产品应该是0xc000000080000000 。 但是如果你认为你的编译器知道如何处理混合types,你怎么能得到这个呢? 这就是我想到的: int64_t sign = x<0; sign*=-1; //get the sign and make it all ones uint32_t t = abs(x); //if x<0 take two's complement again uint64_t […]

为什么XOR是哈希合并的默认方式?

假设你有两个哈希H(A)和H(B) ,你想合并它们。 我已经读过,将两个哈希合并的一个好方法就是将它们XOR ,例如XOR( H(A), H(B) ) 。 我已经find了最好的解释,在这里简要地谈谈这些散列函数的指导方针 : 对两个数字进行大致随机分布的结果,导致另一个数字仍然具有大致随机分布*,但现在取决于这两个值。 … *在两个数字的每一位进行组合,如果两个位相等,则输出0,否则为1.换句话说,在50%的组合中,将输出1。 所以如果两个input比特各自有0或1的几率,那么输出比特也是如此。 你能解释为什么XOR应该成为哈希函数(而不是OR或AND等)的默认操作的直觉和/或math吗?

了解按位与运算符

在Kochan的“Objective-C编程”一书中,我一直在阅读Objective-C中的位运算符。 我对这个部分非常困惑,尽pipe到目前为止,我已经真正理解了所有其他的东西。 这是一本书的引用: 按位与运算符 按位与经常用于屏蔽操作。 也就是说,这个操作符可以很容易地用来将一个数据项的特定位设置为0.例如,该语句 w3 = w1 & 3; 将w1的值与常数3按位“与”分配给w3。这具有将w中除了最右边两位之外的所有位设置为0并保留来自w1的最右边两位的相同的作用。 与C中的所有二进制算术运算符一样,二进制位运算符也可以通过添加等号来用作赋值运算符。 该声明 word &= 15; 因此执行与以下相同的function: word = word & 15; 此外,它的作用是将除了最右边四个字之外的所有字都设置为0.在使用常量执行按位运算时,通常以八进制或hex表示常量更为方便。 好的,这就是我想要了解的。 现在,我对这个概念非常困惑,如果有人愿意帮我解决这个问题,我只是想澄清一下。 当这本书现在引用“设置所有的比特”时,所有的比特……究竟是什么。 这不就是二垒的0或1,换句话说,二进制? 如果是这样的话,为什么在第一个例子中,除了“最右边的2”之外的所有位都是0呢? 是2,因为它是3 – 1,从我们的常数? 谢谢!

什么是位掩码?

我对C编程相当陌生,并且遇到了位掩码的问题。 有人能向我解释位掩码的一般概念和function吗? 例子非常感谢。

用一个乘法提取位

我看到一个有趣的技术用于解答 另一个问题 ,并希望更好地理解它。 我们得到一个无符号的64位整数,我们对以下几点感兴趣: 1…….2…….3…….4…….5…….6…….7…….8……. 具体来说,我们想把他们移到前八名,如下所示: 12345678……………………………………………….. 我们不关心所表示的位的值. ,而且不必保存。 解决方法是屏蔽不需要的位,并将结果乘以0x2040810204081 。 事实certificate,这是一个窍门。 这种方法有多普遍? 这种技术可以用来提取任何位的子集? 如果不是,那么如何判断这个方法是否适用于一组特定的位? 最后,如何find(a?)正确的乘法器来提取给定的位?

查找位数组中最重要的位(最左边)

我有一个位数组实现,其中第0个索引是数组中第一个字节的MSB,第8个索引是第二个字节的MSB等等。 什么是快速find在这个位arrays中设置的第一位的方法? 我查过的所有相关解决schemefind了第一个最不重要的位,但我需要第一个最重要的位。 所以,给定0x00A1,我想要8(因为它是从左边的第九位)。

按位运算符和“字节顺序”

按位操作, sorting是否完全重要? 无论是逻辑还是移位? 我正在做一些关于按位运算符的功课,我不能在头脑上做什么,而且我想我已经被挂在头上了。 也就是说,我正在使用一个小型机器(就像大多数机器一样),但这是需要考虑还是被浪费的事实呢? 如果有问题,我使用C.