我是C ++的新手,只有Java编程知识。任何人都可以解释下面代码的含义:
#define DEF 134 ;
int k;
char msk;
PMSK *pm; //At the begining of class some declaration
// i is some counter(int)
if ( (nVersion >= 2004) && (nVersion < 2008))
{
k = to_bits(DEF, &msk);
if ( pm->orbits[k] & msk ) // for version >= 2004
{
x = atoi( grprs[i] );
if ( !defpair( i, x ) )
pm->orbits[k] &= 0xFF ^ msk; // turn off bit
}
}
to_bits()
是返回整数值和(char)msk值的方法(例如1000)。它涉及到位操作。
什么是pm->orbits[k]
?我们可以像pm.orbits[k]
那样用Java替换它吗?
那么,最后一行代码到底是做什么的呢?
答案 0 :(得分:2)
What is pm->orbits[k]? can we replace it in java like pm.orbits[k]?
基本上,是的。 ->
运算符取消引用然后访问一个字段(也称为访问指针指向的对象的字段/函数)。但是,如果您有一个引用类型,那么您将获得“免费”的引用。
PMSK *pm1; // assume this has been initialized to point to something valid
PMSK &pm2; // assume this is a valid reference
PMSK pm3; // assume this is a valid declaration
pm1->orbits[0]; // accesses field orbits[0] of object pointed to by pm1
(*pm1).orbits[0]; // equivalent to above statement
pm2.orbits[0]; // it's implicitly understood that de-referencing should take place
pm3.orbits[0]; // no need to dereference
解析最后一行代码:
pm->orbits[k] &= 0xFF ^ msk; // turn off bit
^
是按位异或运算符(a.k.a. xor)。基本上,如果两个位不相等则返回位值1,否则返回0.
&=
是按位和分配运算符。相当于以下内容:
pm->orbits[k] = pm->orbits[k] & (0xFF^msk);
按位和运算符匹配等效位并确定两者是否为1.如果是,则结果为1.否则,它为0.所以100001 & 100100 = 100000
(二进制数)。
所以它需要msk中的任何内容,切换最低的8位(1 -> 0
和0 -> 1
),然后按位和当前的pm->orbits[k]
字段。最后,它将结果分配回pm->orbits[k]
在Java中,需要进行显式检查以某种方式将结果从数字转换为布尔值。但是,在C ++中,隐含地理解任何不为0的东西都是正确的。
if(1) // same as if(1!=0)
if(2) // same as if(2!=0)
if(0) // same as if(0!=0)
if(-1) // same as if(-1!=0)
答案 1 :(得分:1)
是的,您可以替换您提到的代码。 ' - &gt;' operator取消引用指向PMSK
对象的指针。 Java没有指针,只有引用,但它们的使用方式相同。
最后一行是清除msk中设置的位,但通常这样做:
pm->orbits[k] &= ~msk;
如果要设置msk中的位,可以使用:
pm->orbits[k] |= msk;
此外,以下行需要求值为布尔表达式,而在C ++中它只需要非零:
if ((pm->orbits[k] & msk) != 0)
{
...
}
答案 2 :(得分:0)
什么是pm-&gt;轨道[k]?我们可以取代吗? 它在java中像pm.orbits [k]?
是的,pm是一个指针,->
表示法是如何访问指针上的成员。
最后一行是一个按位操作,称为exclusive or,^
运算符是相同的,在Java中做同样的事情。
答案 3 :(得分:0)
- &gt; operator取消引用指针以选择字段。
最后一行代码使用0xFF执行msk值的按位异或(XOR)。然后使用索引k处的pm->轨道数组值对该值进行逐位与运算。
在学习C ++并使用此代码时会有一些帮助的主题
几乎任何介绍性的C ++文本都会有这个信息。