这行代码是什么意思(按位运算符)

时间:2018-07-17 05:51:26

标签: c pointers bitwise-operators

#define LODWORD(x) (*((unsigned int*)&(x)))

我正在将C代码转换为python,还不太了解。如果有人能解释如何阅读本手册或它的含义,将不胜感激。

3 个答案:

答案 0 :(得分:3)

&(x)                  // get address of `x` as a pointer to whatever x is
(unsigned int*)(...)  // cast it to a pointer to `unsigned int`
*(...)                // then read that address' contents as if it was `unsigned int`

如果确实需要,并且仅在我知道CPU体系结构的情况下,我才使用union,否则这是非常不安全的:P

答案 1 :(得分:2)

这是一个宏,用于获取64位变量的低public class EDMTKeyboard extends InputMethodService implements KeyboardView.OnKeyboardActionListener { private KeyboardView kv; private Keyboard keyboard; private boolean isCaps=false; @Override public View onCreateInputView() { kv=(KeyboardView)getLayoutInflater().inflate(R.layout.keyboard,null); keyboard=new Keyboard(this,R.xml.qwerty); kv.setKeyboard(keyboard); kv.setOnKeyboardActionListener(this); Log.e("Message","Started"); return kv; } @Override public void onPress(int primaryCode) { } @Override public void onRelease(int primaryCode) { } @Override public void onKey(int i, int[] ints) { InputConnection ic=getCurrentInputConnection(); playClick(i); switch (i) { case Keyboard.KEYCODE_DELETE: ic.deleteSurroundingText(1,0); break; case Keyboard.KEYCODE_SHIFT: isCaps=!isCaps; keyboard.setShifted(isCaps); kv.invalidateAllKeys(); break; case Keyboard.KEYCODE_DONE: ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_ENTER)); break; default: char code=(char) i; if(Character.isLetter(code)&& isCaps) code=Character.toUpperCase(code); ic.commitText(String.valueOf(code),1); } } private void playClick(int i) { AudioManager am=(AudioManager)getSystemService(AUDIO_SERVICE); switch (i) { case 32: am.playSoundEffect(AudioManager.FX_KEYPRESS_SPACEBAR); break; case Keyboard.KEYCODE_DONE: case 10: am.playSoundEffect(AudioManager.FX_KEYPRESS_RETURN); break; case Keyboard.KEYCODE_DELETE: am.playSoundEffect(AudioManager.FX_KEYPRESS_DELETE); break; default: am.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD); } } @Override public void onText(CharSequence text) { } @Override public void swipeLeft() { } @Override public void swipeRight() { } @Override public void swipeDown() { } @Override public void swipeUp() { } } (32位),最有可能的是,关联的DWORD宏也可以获取高32位。其他评论指出了宏的一些缺陷,但这是完成此操作的相当普遍的习惯用法。

一些等效的Python代码可能是:

HIDWORD

答案 2 :(得分:0)

首先使用#define定义一个进行替换的宏。它是带有参数的宏,即所谓的“函数式宏”。 在#define之后,当出现表达式LODWORD(whatever you write here)时,它将被(*((unsigned int*)&(whatever you write here)))替换,然后将代码提供给编译器。这称为“宏扩展”。编译器将仅看到扩展表达式。

LODWORD(foo)的宏扩展表达式执行以下操作:

(foo)是宏中的常见用法:将参数放在括号中以避免运算符优先级错误。

&(foo)的意思是“ (foo)的地址”(“指针”)。这将创建一个表示foo的存储位置的值。它的类型为“指向foo类型的指针”。

(unsigned int*)&(foo)将“ foo的地址”转换为“ unsigned int foo的地址”。运算符(insigned int*)被称为“强制运算符”。它将结果类型“指向foo的指针”更改为“指向unsigned int的指针”。

((unsigned int*)&(foo))覆盖运算符优先级。现在,您已经“指向unsigned int的存储位置处的foo指针。

*((unsigned int*)&(foo))返回unsigned int的存储位置处的foo的值(即使foo不是无符号整数,即使该存储位置违反了对齐要求也是如此) unsigned int)。

(*((unsigned int*)&(foo)))是宏中的另一个常见用法:将整个表达式放在括号中以避免运算符优先级错误。这样,宏就可以始终像是一个函数一样使用。