位操作-解释下面的c++代码片段

bit manipulation - Explain the following C++ Code snippet

本文关键字:c++ 代码 片段 解释 位操作      更新时间:2023-10-16

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

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. ^是位异或操作符(又称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]

在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)

可以替换您提到的代码。'->'操作符解引用指向PMSK对象的指针。Java没有指针,只有引用,但它们的使用方式相同。

最后一行是清除在msk中设置的位,但通常是这样做的:

pm->orbits[k] &= ~msk;

如果你想设置msk中的位,你可以使用:

pm->orbits[k] |= msk;

同样,下面一行需要求值为布尔表达式,在c++中,它只需要是非零即可:

if ((pm->orbits[k] & msk) != 0)
{
    ...
} 

什么是pm->轨道[k]?我们可以替换吗?它在Java中像pm.轨道[k]?

是的,pm是一个指针,->符号是如何访问指针上的成员。

最后一行是位操作,称为排他或,^操作符在Java中是相同的,并且做同样的事情。

操作符对指针进行解引用,以选择字段。

最后一行代码用0xFF对msk值进行位排外或(XOR)。然后将该值与pm->轨道数组在索引k处的值按位进行并和。

一些可以帮助你学习c++和使用这些代码的主题

  • 指针http://www.cplusplus.com/doc/tutorial/pointers/
  • c++ for Java Programmers ht
  • 一般按位操作http://vipan.com/htdocs/bitwisehelp.html
  • c++中的
  • 数组
  • 通过引用和值传递