位操作-解释下面的c++代码片段
bit manipulation - Explain the following C++ Code snippet
我是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
^
是位异或操作符(又称xor)。基本上,如果两个位不相等,则返回位值1,否则返回0。&=
是位赋值操作符。相当于以下内容:
按位和运算符匹配等效位并确定两者是否都为1。如果是,则结果为1。否则,它就是0。所以pm->orbits[k] = pm->orbits[k] & (0xFF^msk);
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)
可以替换您提到的代码。'->'操作符解引用指向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++中的
- 数组
- 通过引用和值传递
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值