解释以下C ++代码段

时间:2011-04-26 06:43:02

标签: c++ bit-manipulation

我是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替换它吗? 那么,最后一行代码到底是做什么的呢?

4 个答案:

答案 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 
  1. ^是按位异或运算符(a.k.a. xor)。基本上,如果两个位不相等则返回位值1,否则返回0.

  2. &=是按位和分配运算符。相当于以下内容:

    pm->orbits[k] = pm->orbits[k] & (0xFF^msk);
    
    按位和运算符匹配等效位并确定两者是否为1.如果是,则结果为1.否则,它为0.所以100001 & 100100 = 100000(二进制数)。 所以它需要msk中的任何内容,切换最低的8位(1 -> 00 -> 1),然后按位和当前的pm->orbits[k]字段。最后,它将结果分配回pm->orbits[k]

  3. 在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 ++文本都会有这个信息。