我有一个程序,我目前使用byte[]
布尔数组,即每个元素是0
或1
。我认为我应该尝试通过按位操作来加速程序。Java的非标准位操作
我需要解决的问题之一如下。例如,让
long a = 5 = "00101"
(我不写在开头都提不起兴趣零)
long b = 24 = "10100"
。 (我不写在开头都提不起兴趣零)
我需要动手术,O
说,这样aOb
在需要的位置,其中a
是1
,需要的b
的相应值和连接它们使得在此我们将会是
2 = "00010"
。 (我不写在开头都提不起兴趣零)
a 00101
O ↓ ↓ <- pick bits pointed by `1` in a
b 10100
↓ ↓
1 0 -> concatenate selected bits -> 10
编辑: 试图澄清: 好了,所以我们通过a
无论是从左边或右边。如果我们遇到0
,我们什么也没有。如果我们计算1
,我们取相应指数b
的值。例如,从左边下去,我们什么也不做了两个0
s,则我们发现1
因此,我们采取相应的1
从b
,我们找到另一个0
在a
,什么也不做,然后我们在a
找到另一个1
,并采取相应的0
从b
。
编辑: 另一种方式把它是这样的:(?这是可能的)移位a
的权利和读出值。如果是1
,我们将b
移到右侧,读取该值,将其存储到结果变量r
并将r
移到右侧。如果是0
,我们将b
转移到右侧,忘记价值,并与r
无关。
编辑: 我会详细阐述一下目的,试图澄清我想要做什么。我们有一组布尔变量(比如5表示同意我们的例子)。变量b
根据一些索引表示它们的状态数组。变量a
中的1
代表我们系统中对于某个布尔变量(比如0)有影响的布尔变量的索引,即我们的例子中的2和4。第二和第四布尔变量的值构成了与第0个变量相关联的真值表的一个可能输入。
有什么建议吗?编辑: 现在,我正在做的是这个。假设我们有一个带有5个布尔变量的系统,索引为$ 0,1,2,3,4 $。假设第0个变量是第2和第4个变量的函数,有一个事实表,即
2 | 4 |Output for 0
0 | 0 | 0
0 | 1 | 0
1 | 0 | 0
1 | 1 | 1
我始终保持以这种方式排序表,所以我并不真正需要的左桌子的一部分。该表的右侧部分实现为byte[]
阵列。为了找到输出,我只需将输入读取的整数表示作为二进制数字。例如。输入10
是2,所以我的输出是我的byte[]
阵列中索引2处的值。为了找到输入,我需要我的系统当前状态的一部分,它对应于所讨论的变量,即0。也就是说,我需要第二个和第四个变量的值,按顺序读取。
这样:
byte[] c = new byte[]{1,0,1,0,0}; //Corresponds to b above
int[] ind = new int[]{2,4}; //Indices of c that we're interested in
byte[] table = new byte[]{0,0,0,1}; //The truth table
int j = 0; //Truth table index
for(int i = 0; i < ind.length; i++) {
j += c[ind[i]]*(1 << (ind.length - 1 - i)) //Binary to integer
}
//Output is table[j]
定义“连接”。我不认为这个解释是严格的。我建议你制定一个真值表,以便我们看到你在说什么。到目前为止,它看起来与逻辑AND没有区别,但它也可能是逻辑蕴涵运算符。 – EJP
你能澄清一点点吗?因为你所描述的只是一个&b,按位AND – Maljam
你刚才定义的过程给出的结果是00100,而不是00010. – EJP