- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我面临着一个相当奇怪的问题。我正在为不支持按位运算的体系结构开发编译器。然而,它处理带符号的 16 位整数算术,我想知道是否可以仅使用以下内容来实现按位运算:
我希望能够支持的按位运算是:
通常问题是相反的;如何使用按位黑客实现算术优化。但在本例中并非如此。
在此架构上可写内存非常稀缺,因此需要按位运算。按位函数本身不应使用大量临时变量。然而,恒定的只读数据和指令存储器是丰富的。这里还需要注意的是,跳转和分支并不昂贵,并且所有数据都可以轻松缓存。跳转花费的周期是算术(包括加载/存储)指令的一半。换句话说,上述所有支持的功能的成本都是单次跳转周期的两倍。
<小时/>我发现您可以使用以下代码进行补码(求反位):
// Bitwise one's complement
b = ~a;
// Arithmetic one's complement
b = -1 - a;
我还记得除以 2 的幂时的旧移位技巧,因此按位移位可以表示为:
// Bitwise left shift
b = a << 4;
// Arithmetic left shift
b = a * 16; // 2^4 = 16
// Signed right shift
b = a >>> 4;
// Arithmetic right shift
b = a / 16;
对于其余的按位运算我有点一无所知。我希望该架构的架构师能够提供位操作。
我还想知道是否有一种快速/简单的方法可以在不使用内存数据表的情况下计算二的幂(用于移位操作)。一个简单的解决方案是跳入乘法领域:
b = 1;
switch (a)
{
case 15: b = b * 2;
case 14: b = b * 2;
// ... exploting fallthrough (instruction memory is magnitudes larger)
case 2: b = b * 2;
case 1: b = b * 2;
}
或者设置和跳跃方法:
switch (a)
{
case 15: b = 32768; break;
case 14: b = 16384; break;
// ... exploiting the fact that a jump is faster than one additional mul
// at the cost of doubling the instruction memory footprint.
case 2: b = 4; break;
case 1: b = 2; break;
}
最佳答案
移位的第一个解决方案(shift是移位距离,不能为负数,a是要移位的操作数,也包含完成后的结果)。功率表由所有三个类次操作使用。
// table used for shift operations
powtab = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, -32768 };
// logical shift left
if (shift > 15) {
a = 0; // if shifting more than 15 bits to the left, value is always zero
} else {
a *= powtab[shift];
}
// logical shift right (unsigned)
if (shift > 15) {
a = 0; // more than 15, becomes zero
} else if (shift > 0) {
if (a < 0) {
// deal with the sign bit (15)
a += -32768;
a /= powtab[shift];
a += powtab[15 - shift];
} else {
a /= powtab[shift];
}
}
// arithmetic shift right (signed)
if (shift >= 15) {
if (a < 0) {
a = -1;
} else {
a = 0;
}
} else if (shift > 0) {
if (a < 0) {
// deal with the sign bit
a += -32768;
a /= powtab[shift];
a -= powtab[15 - shift];
} else {
// same as unsigned shift
a /= powtab[shift];
}
}
对于 AND、OR 和 XOR,我无法想出一个简单的解决方案,因此我将通过循环每个位来实现。可能有更好的技巧来做到这一点。伪代码假设 a 和 b 是输入操作数,c 是结果值,x 是循环计数器(每个循环必须恰好运行 16 次):
// XOR (^)
c = 0;
for (x = 0; x <= 15; ++x) {
c += c;
if (a < 0) {
if (b >= 0) {
c += 1;
}
} else if (b < 0) {
c += 1;
}
a += a;
b += b;
}
// AND (&)
c = 0;
for (x = 0; x <= 15; ++x) {
c += c;
if (a < 0) {
if (b < 0) {
c += 1;
}
}
a += a;
b += b;
}
// OR (|)
c = 0;
for (x = 0; x <= 15; ++x) {
c += c;
if (a < 0) {
c += 1;
} else if (b < 0) {
c += 1;
}
a += a;
b += b;
}
假设所有变量都是 16 位,并且所有操作都表现为有符号(因此当设置第 15 位时,a<0 实际上为 true)。
编辑:我实际上测试了所有可能的操作数值(-32768 到 32767),以确保移位范围从 0 到 31 的正确性,并且它可以正常工作(假设整数除法)。对于 AND/OR/XOR 代码,在我的机器上进行详尽的测试需要太长时间,但由于这些代码非常简单,所以无论如何都不应该出现边缘情况。
关于bitwise-operators - 是否可以使用整数算术实现按位运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2982729/
我正在尝试从 1 循环到 12,并为应用中特定 View 的更改网格输出一些跨度宽度。 $span-width: 8.21875%; $gap: 0.125%; @for $i from 1 thro
我试图在 Jekyll 的液体模板引擎中做一些基本的算术。我已经分配了一个变量 numColumns我试图在条件语句中使用它。 {% assign numColumns = 3 %} 注意我在下面的表
与 shift_left ieee.numeric_std 的功能, 我想将信号左移并插入 1或 0从右边。 signal qo: signed (3 downto 0) := (others=>'0
您在控制台中输入一些内容,例如(8+8)。然后程序会告诉你括号的插入是否正确。 这是我对错误括号的定义(当然还没有完成): () this means if one array element is
我有两个表(使用 PostgreSQL),它们看起来如下: 表1(p点从1到450递增1) --------+-------+--------+---------+---------+-------+
我正在编写一个任意精度的有理数包,我需要测试它的正确性和效率。当然,我可以自己组合一组临时测试,但由于我远不是第一个这样做的人,所以我认为值得一问:任何人都可以推荐我可以使用的现有测试集吗? 编辑:我
我最近一直在使用和学习 CSS3,并享受它的许多功能。现在我想知道是否可以设置一个有条件地分配 block 元素宽度的 CSS 规则。我所追求的那种东西 - 如果屏幕宽度小于 500 像素,则使用 3
我对这个实验中h的值有点疑惑。在 cpp 中, int h,J=3,n=200,p=3,h_m=(n+p+1)/2; float rt=(float)h_m/n; for(int j=0,j
算术+和按位或有什么区别吗?这有什么不同。 uint a = 10; uint b = 20; uint arithmeticresult = a + b; uint bitwiseOR = a |
我一直在尝试让算术 if 运算符起作用,但我似乎做不到。我是 C++ 的新手,仍在学习基础知识,但我只是想知道我是否正确使用了这个运算符。如果 x using namespace std; int
我在 VC++2010 中做过一些混合不同大小的操作数导致添加操作溢出的测试: int _tmain(int argc, _TCHAR* argv[]) { __int8 a=127;
#include int main(int argc,char *argv[]) { int i=10; void *k; k=&i; k++; printf("%p\n
在过去的 5 个小时里,我一直在寻找答案。尽管我找到了很多答案,但它们并没有以任何方式提供帮助。 我基本上要寻找的是任何 32 位无符号整数的按位异或运算符的数学、算术唯一表示。 尽管这听起来很简单,
结果是 127 double middle = 255 / 2 虽然这产生了 127.5 Double middle = 255 / 2 同时这也会产生 127.5 double middle = (
我在 Java 1.7 中有以下代码: DateFormat df = DateFormat.getInstance(); Date startDate = df.parse("07/28/12 01
此查询有效,没有错误 select add_months(date '2011-01-31', 1) from dual; ,而这个: select date '2011-01-31' + inter
理论上来说,如果我有一个无序项目列表 Link1 Link1 我如何使用 jQuery 执行以下操作? 1) 找到每个单独a元素的宽度 2) 找到每个单独的 li 元素的宽度 3)
想法如下:假设我有一个列表 P = [(1,0),(4,3)] 或类似的列表。我想以以下方式计算此列表定义的多项式:1X^0 + 4X^3。 为此,我编写了以下内容: evaluate(P,X,Y)
我正在从 mysql 数据库中提取数据。我想添加多次运行的长度,并按照跑得最远的人的排名对它们进行排序。 function determineLength($db, $name){
当尝试执行一个简单的 bash 脚本以将前面带有 0 的数字递增 1 时,原始数字被错误地解释。 #!/bin/bash number=0026 echo $number echo $((number
我是一名优秀的程序员,十分优秀!