Tag: 位操作

签名类型的按位移位运算符

我试图理解有符号运算符在有符号和无符号类型上的行为。 根据ISO / IEC文件,以下是我的理解。 左移算子 E1 << E2的结果是E1左移E2位位置 左移帐户中的空位将由零填充。 E1为有符号非负数: E1 << E2将导致E1乘以E2的2次幂,如果该值可由结果类型表示。 Q1:签署否定书怎么样? Q2:我无法理解以下语境中“减少模数”的含义。 “如果E1具有无符号类型,则结果的值为E1×2E2,比结果类型中可表示的最大值减少一个模数” 。 右移算子 E1 >> E2的结果是E1右移E2位的位置。 E1为有符号非负/无符号 :结果的值是E1 / 2E2的商的整数部分 Q3:对于有符号的负整数,我看到,有些书定义了空位将填充1详细说明使用右移运算符对带符号的负int。

有没有办法在没有模数/除法运算符的情况下编写“mod 31”?

如果操作数是2的幂,则可以在没有模数运算符或除法的情况下容易地获得数字的模数。在这种情况下,下面的公式成立: x % y = (x & (y − 1)) 。 在许多架构中,这通常很有效。 mod 31也可以这样做吗? int mod31(int a){ return a % 31; };

如何在不使用任何比较运算符且不使用if,else等的情况下以编程方式返回两个整数的最大值?

如何在不使用任何比较运算符且不使用if , else等的情况下以编程方式返回最多两个整数?

快速24位arrays – > 32位arrays转换?

快速摘要: 我有一个24位值的数组。 关于如何快速将各个24位数组元素扩展为32位元素的任何建议? 细节: 我正在使用DirectX 10中的Pixel Shaders实时处理传入的video帧。一个绊脚石是我的帧从捕获硬件进入24位像素(作为YUV或RGB图像),但DX10需要32位像素纹理。 因此,在将其加载到GPU之前,我必须将24位值扩展为32位。 我真的不在乎我将剩余的8位设置为什么,或者输入的24位是否在32位值中 – 我可以在像素着色器中修复所有这些。 但我需要非常快速地将24位转换为32位。 我对SIMD SSE操作并不十分熟悉,但从我粗略的一瞥来看,看起来我不能使用它们进行扩展,因为我的读写操作大小不一样。 有什么建议? 还是我按顺序按摩这个数据集? 这感觉非常愚蠢 – 我使用像素着色器进行并行处理,但在此之前我必须执行顺序逐像素操作。 我一定错过了一些明显的东西……

在C中有效地提取double *的小数部分

我希望采用IEEE双精度并以最有效的方式删除它的任何整数部分。 我想要 1035 ->0 1045.23->0.23 253e-23=253e-23 我不关心正确处理非正规,无穷大或NaN。 我不介意有点麻烦,因为我知道我正在使用IEEE双打,所以它应该适用于各种机器。 无分支代码将是更受欢迎的。 我的第一个念头是(伪代码) char exp=d.exponent; (set the last bit of the exponent to 1) d<0); (& mask the last 52 bits of d) (shift d left until the last bit of the exponent is zero, decrementing exp each time) d.exponent=exp; 但问题是我无法想到一个有效的方法来向左移动直到指数的最后一位为零,而且如果没有设置所有最后一位,它似乎需要输出零。 这似乎与基数2对数问题有关。 对此算法或任何更好的算法的帮助将非常感激。 我应该注意到我想要无分支代码的原因是因为我希望它能有效地进行矢量化。

如何手动(按位)执行(浮点)x?

现在,这是我应该实现的函数的函数头: /* * float_from_int – Return bit-level equivalent of expression (float) x * Result is returned as unsigned int, but * it is to be interpreted as the bit-level representation of a * single-precision floating point values. * Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while * Max ops: 30 * Rating: […]

当你移位到变量的末尾时会发生什么?

如果你有一些变量(在堆栈上),你左或右位移超过它的结束会发生什么? 即 byte x = 1; x >> N; 如果x是指向一个字节的内存的指针并且你做同样的事情怎么办? byte* x = obtain pointer from somewhere; *x = 1; *x >> N;

按位运算等效于大于运算符

我正在研究一个函数,它基本上可以看到两个整数中的哪一个更大。 传递的参数是2个32位整数。 诀窍是允许的唯一操作员! ~ | & <> ^ ! ~ | & <> ^ ! ~ | & <> ^ (没有转换,除了signed int,*,/, – 等其他数据类型。)。 到目前为止,我的想法是将两个二进制文件组合在一起,以查看它们不共享的1值的所有位置。 我想要做的就是取这个值并将最远的1隔离开来。 然后看看它们中的哪一个具有该值。 那个价值就会越大。 (假设我们使用8位整数而不是32位)。 如果传递的两个值是01011011和01101001我在它们01101001使用了^来得到00100010 。 然后我想把它变成00100000换句话说01xxxxxx -> 01000000那么&它的第一个数字!! 结果并将其归还。 如果它是1 ,则第一个#更大。 有关如何01xxxxxx -> 01000000或其他什么帮助的任何想法? 忘记注意:没有ifs,whiles,fors等……

如何检查我的字节标志?

我使用一个字节来存储一些标志,如10101010 ,我想知道如何validation特定位是1还是0 。

32位有符号整数乘法,不使用64位数据类型

我想在不使用64位数据类型的情况下进行32位有符号整数乘法。 我的输入是Q1.31(两种)格式。 input1 = A32 (Ah Al) – higher, lower half’s of A32 input2 = B32 (Bh Bl) – higher, lower half’s of B32 结果应为Q1.31格式,保留溢出情况。 我需要C代码。 请提供格式说明。