【问题标题】:How can I do bit operations with a pointer as per the following code?如何按照以下代码使用指针进行位操作?
【发布时间】:2021-02-12 10:33:23
【问题描述】:
  • 此函数读取相应寄存器地址处的值。
  • 我正在尝试对地址的位进行一些操作。
  • 我遵循的公式是:(1
  • 我将如何运行此函数的示例是 (0x8,1) ,0x8 是寄存器地址,1 是 nbytes。
char *function(struct devices *address, int nbytes)
{  
    if((1<<0)|address)
    {
      printf("Hello World");
    }
    else if((1<<2)|address)
    {
      printf("Hello World");
    }
 
  return 0;
 
}

  • 例如假设我有一个寄存器地址 0x8 = 0000 1000 ,现在假设我想设置这个寄存器的第 2 位。所以,它变成了 (1
  • 我正在使用这个 (1

但是问题在于我无法使用地址,因为它是一个指针,所以有人可以告诉我如何相应地设置地址以便可以执行位操作吗?还是我自己在代码里面手动定义地址?

【问题讨论】:

  • 我不明白问题出在哪里。您是在问如何取消引用指针并获取它指向的值?
  • 不清楚您是要更改地址的位(这将是不寻常的),还是要修改地址指向的某些硬件寄存器的位。指针是指向结构的指针也很奇怪。你能包括结构的定义或它的一些sn-p吗?
  • @PaulHankin,我必须切换和设置/重置地址的位以分别对每个位执行某些功能。例如设置第 1 位,它将执行某些功能,设置第 2 位,然后设置其他功能等。结构的定义只不过是一个包含寄存器地址结构的结构。
  • (1&lt;&lt;0)|address 始终为真。要测试某个值,请使用&amp;,而不是|,如1&lt;&lt;position &amp; x
  • 例如,假设我有一个 0x8 = 0000 1000 的寄存器地址,现在假设我想设置这个寄存器的第 2 位。地址是否与更改该寄存器的内容有关?如果你想改变客厅家具的位置,你不要改变邮箱上的门牌号。

标签: c bit


【解决方案1】:

这听起来不是一个好主意,但你可以这样做:

#include <stdint.h>

char *function(struct devices *address, int num_bytes)
{  
    uintptr_t x = (uintptr_t) address;

    if((1<<0)|x)
    {
      printf("Hello World");
    }
    else if((1<<2)|x)

但除非您 100% 确定自己在做什么,否则请避免这样做。不要假设内存地址的某些数字属性。这可能会导致非常不确定且难以追踪的错误。

请注意,只要xy 中的任何一个不为零,x|y 类型的表达式就会被评估为真。你可能想改用(1&lt;&lt;0)&amp;x 之类的东西。

【讨论】:

  • @anoymous_coder 我不确定它是否有帮助。因为这看起来真的很奇怪。 ;)
  • 是的,我想是的。
  • (1&lt;&lt;0)|x 始终为真。
  • @EricPostpischil 是的,但这不在问题范围内
【解决方案2】:

从 stdint.h 转换为 uintptr_t,对该类型执行所有按位运算,然后在完成后转换回指针类型。

当然,如果您不知道自己在做什么,从某个整数类型转换为指针类型可能会导致各种问题,例如未对齐的访问和/或编译器进行香蕉代码优化。小心行事。

【讨论】:

  • 应该做!感谢您的提醒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多