我有一个带有两列整数数据的临时表,我想找到第三列中两列之间的差异.
#TEMP1
Present previous
59 88
75 75
45 45
77 88
09 08
#temp2
Difference
29
0
0
11
-1
Run Code Online (Sandbox Code Playgroud)
这可能吗 ??
如果我有二进制形式的2个数字作为字符串,并且我想添加它们,我将从最右端开始逐位数字.所以001 + 010 = 011但是假设我必须做001 + 001,我应该如何创建一个代码来弄清楚如何进行转移响应?
我正在寻找一些用于签名饱和64位加法的C代码,它使用gcc优化器编译为高效的X86-64代码.便携式代码是理想的,尽管如果需要可以使用asm解决方案.
static const int64 kint64max = 0x7fffffffffffffffll;
static const int64 kint64min = 0x8000000000000000ll;
int64 signed_saturated_add(int64 x, int64 y) {
bool x_is_negative = (x & kint64min) != 0;
bool y_is_negative = (y & kint64min) != 0;
int64 sum = x+y;
bool sum_is_negative = (sum & kint64min) != 0;
if (x_is_negative != y_is_negative) return sum; // can't overflow
if (x_is_negative && !sum_is_negative) return kint64min;
if (!x_is_negative && sum_is_negative) return kint64max;
return sum;
}
Run Code Online (Sandbox Code Playgroud)
写入的函数产生具有多个分支的相当长的汇编输出.有关优化的提示吗?看起来它应该只用一个带有一些CMOV指令的ADD来实现,但我对这些东西有点生疏.
编辑:我重新格式化了帖子以便更清楚.
为什么这样做:
struct A {};
struct B {
B(A){}
};
void operator+(const B&, const B&) {}
int main()
{
A a1, a2;
a1 + a2;
}
Run Code Online (Sandbox Code Playgroud)
这不是吗?
struct B {
B(const char*){}
};
void operator+(const B&, const B&) {} //error: invalid operands of types 'const char [6]' and 'const char [6]' to binary 'operator+'|
int main()
{
"Hello" + "world";
}
Run Code Online (Sandbox Code Playgroud)
本质上,在第一个示例中a1
,a2
它们都B
通过隐式转换转换为对象并使用operator+(const B&, const B&)
添加.
从这个例子开始,我希望"Hello"
并再次通过隐式构造函数"world"
转换为B
对象,并使用 …
我正在尝试使用以下方法建立减法,加法,除法,乘法和其他操作:
使用以下规则,可以直接实现这样的添加(添加):
ADD (x, y) {
loop X {
y = incr (y)
}
return y
}
Run Code Online (Sandbox Code Playgroud)
但是,我正在努力实现减法.我认为所有其他所需的操作都可以使用减法完成.
任何提示都将非常感激.
我已经熟悉使用加法或使用乘法求幂来实现乘法的着名问题,使用循环或位移算法并添加移位位组合.
现在,我想知道是否有任何方法只使用更高级别的操作来实现加法,例如具体的乘法,或取幂,对数等(减去减法)
这可以通过组合这些操作的某种算法(以及可能的按位运算符作为助手)来实现,或者是作为公理的基本操作的附加,因此除了其定义之外,它不能以其他方式再现?
谢谢.
我无法理解添加运算符或short
数据类型的想法.
据说;
short a = 1;
short b = 2;
short c = a + b;
Run Code Online (Sandbox Code Playgroud)
这将不能编译,因为除了运营商总是投short
,chart
,byte
数据类型,以int
我理解这一点.但是这个;
short c = 1 + 2;
Run Code Online (Sandbox Code Playgroud)
工作得很好.因此,如果添加运算符自动转换short
为int
然后应用结果(其中结果将是一个int
),为什么这样可以正常工作?
编辑:这个问题与原始类型'short'不重复- 在Java中进行转换,因为我理解转换过程.此外,该问题讨论了数据类型的转换,其中我的问题与int
文字有关.
我看到人们使用加法,其中按位OR在概念上更合适,因为他们认为它更快.这是真的?如果是的话,所有现代编译器都知道这个技巧吗?
我在C#Visual Studio 2010中有这些行:
IntPtr a = new IntPtr(10);
IntPtr b = a + 10;
Run Code Online (Sandbox Code Playgroud)
它说:
运算符'+'不能应用于'System.IntPtr'和'int'类型的操作数.
鉴于我在Java中有两个数组,A
并且B
我想要按元素添加元素,这会产生一个sum数组.使用循环隐式执行此操作很容易,但我想知道是否有更优雅的解决方案,可能使用guava集合或构建java utils.或者也许是一种python-ish方式,通过列表推导很容易.
例:
A = [2,6,1,4]
B = [2,1,4,4]
sum = [4,7,5,8]
Run Code Online (Sandbox Code Playgroud)