是否有可能简化(a + b)xor(c + b)?b对最终结果的贡献是什么?请注意,我将布尔代数与算术混合,xor是按位异或对应的位,+是8位的标准加法,在溢出时包围.a,b,c是unsigned char;
我尝试在Prolog CLPFD中实现高效的异或(XOR).这应该是简单的谓词,如:
xor(A, B, AxorB).
Run Code Online (Sandbox Code Playgroud)
A,B,AxorB是自然数(用0表示)和AxorB是的结果A 的XOR B.
我的主要问题是效率.首先,我无法找到任何方法来对两个数字进行异或,而不将这些数字分成可以进一步处理/约束的单独部分,并且打破这些数字的过程(创建适当的约束然后解析它们)正在进行一些处理时间.其次,我不能提出任何有效的方法来"模拟"自然数字上的XOR函数,而不是在下面的第二个代码中给出.
让我们从我的第一个代码开始.这是最简单的XOR实现,它仅适用于1位值(0和1):
xor_1bit_values(A, B, AxorB) :-
AxorB #= (A + B) mod 2.
Run Code Online (Sandbox Code Playgroud)
要将其用于大于1的数字,必须将数字分成位:
xor_number(A, B, Result, Bits) :-
Count is Bits - 1,
xor_number(A, B, Result, Count, 0).
xor_number(A, B, Result, 0, Sum) :-
xor_1bit_values(A, B, Xor),
Result #= Xor + Sum.
xor_number(A, B, Result, Count, Sum) :-
P is 2^Count,
X #= A / P,
Y #= B / P,
xor_1bit_values(X, …Run Code Online (Sandbox Code Playgroud) 我有一个正整数数组 - {1,5,8,2,10}和给定值7.我需要查找数组的子集是否存在,使其元素的XOR值为7.在这种情况下子集是{5,2},因为5 xor 2是7.一个天真的解决方案是找到所有子集并检查是否存在解决方案.我想要一些比天真更好的算法.注意: - 我只需要找出是否存在解决方案.我不需要找到子集.
上面提到的问题如下:给定两个整数x1和x2,找到另一个整数x3,它不同于x1和x2,而不使用if关键字.
我的解决方案基于对整数的逐位运算以及两个位之间的XOR将返回1的事实,当且仅当两个位不相等时.
这个解决方案有效吗?你能找到更好的解决方案吗?当然,运行时考虑和内存消耗应该尽可能好.
注意:三元运算和比较(即 - !=,==)也是不允许的
提前致谢,
盖伊.
我的解决方案
int foo(int x1,int x2)
{
// xor
int x3 = x1 ^ x2;
// another xor
x3 = x3 ^ x2;
// not
x3 = ~x3;
return x3;
}
Run Code Online (Sandbox Code Playgroud) 我在 php 阅读 xor ,我看到了这个例子:
$aa = "A" ^ "}";
echo $aa; // <
Run Code Online (Sandbox Code Playgroud)
所以我在互联网上搜索它是如何工作的,他们说它的总和是 ascii 代码,但上面的代码不是总和。
A = 65
} = 125
65 + 125 = 190
Run Code Online (Sandbox Code Playgroud)
我试图在另一个字符之间求和
$aa = "A" ^ "&";
echo $aa;
Run Code Online (Sandbox Code Playgroud)
但结果是 130 = g
那么超过 97 的任何字符都不是总和吗?
我也检查了这个问题 PHP XOR 字符串,但它没有帮助我。
请注意下面的简单示例:
Module Module1
<Flags>
Public Enum Names
None = 0
Test = 1
Test2 = 2
Test3 = 4
Test4 = 8
End Enum
Sub Main()
Dim test As Names = Names.Test Or Names.Test3
If (test And Names.Test3) = Names.Test3
Console.WriteLine("TRUE")
Else
Console.WriteLine("FALSE")
End If
End Sub
End Module
Run Code Online (Sandbox Code Playgroud)
我的问题的第一部分与这条线有关If (test And Names.Test3) = Names.Test3。
仅仅检查If test And Names.Test3该标志是否存在会更好吗?如果它的计算结果为非零值(意味着该标志存在),那么条件的结果仍然是True。
是否有充分的理由使用第一种方法进行第二种检查?(虽然我的回答是针对VB.NET,但我也想知道这是否是其他地方(例如C#,C ++等)的潜在陷阱)。
此外,关于标记删除,似乎有两种方法可以执行此操作:
test = test Xor Names.Test3 和 test = test And Not Names.Test3 …
我有以下表达式来计算奇偶校验位:
AB0E XOR 73C9 XOR D46A XOR 06E3
如何评估?是吗:
(((AB0E XOR 73C9)XOR D46A)XOR 06E3)
或者是:
(AB0E XOR(73C9 XOR(D46A XOR 06E3)))
我有两个非负整数 x 和 y,它们都最多有 30 位(所以它们的值约为 10^9)。
我想计算有多少组 4 个数字 {a_1, a_2, a_3, a_4} 使得 a_1 + a_2 = x 和 a_3 + a_4 = y 并且所有这 4 个数字的异或等于 0。
解决这个问题最快的算法是什么?
我能想到的最快的方法是将异或方程重新排列为a_1 xor a_2 = a_3 xor a_4。
然后我可以在 O(x) 中计算左侧的所有值,在 O(y) 中计算右侧的所有值,因此整个算法在 O(x + y) 中运行。
我的代码如下:
char ch = t.charAt(t.length() - 1);
// result of XOR of two char is Integer.
for(int i = 0; i < s.length(); i++){
ch = ch^s.charAt(i);
ch = ch^t.charAt(i);
}
return ch;
Run Code Online (Sandbox Code Playgroud)
它抛出错误
第 6 行:错误:类型不兼容:从 int 到 char 的可能有损转换 ch = ch^s.charAt(i);
第 7 行:错误:类型不兼容:从 int 到 char 的可能有损转换 ch = ch^t.charAt(i);
2 错误
然而,当我改变
ch = ch^s.charAt(i);
ch = ch^t.charAt(i);
Run Code Online (Sandbox Code Playgroud)
到
ch ^= s.charAt(i);
ch ^= t.charAt(i);
Run Code Online (Sandbox Code Playgroud)
然后,我的代码就可以工作了。
'^=' 和 '* = ^ ' 不同吗??为什么我搜索这个关于'^='的问题,它说它们是一样的??
我已经尝试了几个集合的这个练习,例如 {2, 3, 5}, {5, 11} 其中元素的异或不为 0。我的直觉表明它总是非零,但我无法证明它。我在网上搜索,但没有找到任何东西。任何帮助将不胜感激。
bitwise-xor ×10
algorithm ×3
xor ×3
arrays ×1
bitwise-and ×1
c ×1
c++ ×1
clpfd ×1
java ×1
math ×1
php ×1
primes ×1
prolog ×1
subset-sum ×1
swi-prolog ×1
vb.net ×1