【问题标题】:Assistance in basic bit manipulation协助基本位操作
【发布时间】:2010-02-04 21:33:37
【问题描述】:

这是我之前回答的问题的后续问题:

Reading characters on a bit level

我似乎遇到的问题是了解 C 中位操作的基本概念。我了解需要做什么,但实际上开发解决方案时遇到了麻烦。

一个例子:

使用逻辑运算符将 01101010 更改为 00111110。

我了解实现解决方案的原理和掩码需求,但我不了解如何以编程方式进行。

我来自 C# 基础,最近才开始使用 C 进行开发。

谁能给我一些指导或提示来完成这个例子?

以下是解决方案,以防其他人发现它有用:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h.>

int main()
{
    //01101010 - 106 Decimal
    char a = 0x6A;

    //01010100 - 84 Decimal
    char b = 0x54;

    //00111110 - Uses exclusive or (XOR)
    char c = a ^ b;

    //Prints out in Hex - 62 Decimal
    printf("%x",c);

    return 0;
}

【问题讨论】:

  • 我在使用 C# 时从来不需要降到这么低的水平,不过很高兴知道。
  • 您希望最近编辑的输出是什么?
  • 不要将值打印为字符,而是显示文本。您不能直接从 C 中以二进制形式打印,但十六进制可能会有所帮助(从十六进制转换为二进制比从十进制转换更容易)。使用 printf("%x", c);以十六进制打印。
  • @unwind:太好了,我添加了我的解决方案,结果是 3e 为十六进制,转换为十进制是 62。谢谢你的提示。

标签: c bit-manipulation


【解决方案1】:

您可以将它们异或。如果恰好有一位为 1,则两位的 XOR 为 1。

01101010 异或 00111110 = 01010100

将第一个值与此结果进行异或运算将得到第二个值。

01101010 异或 01010100 = 00111110

在 C 中:

char a = 0x6A;
char b = 0x3E;
char c = a ^ b;

(c ^ a == a ^ b ^ a) && (a ^ b ^ a == b)

【讨论】:

  • 您能解释一下您发布的 C 代码中的最后一条语句吗?确切地说,“(c ^ a == a ^ b ^ a)&&(a ^ b ^ a == b)”位。我想我理解它,但我只是想澄清它的目的,所以我不会误解它。
  • 没有真正的目的。它只是一个(有效的 C)真表达式,用于演示语法并回顾我们所做的工作。
【解决方案2】:

我会这样进行:首先看看哪些位需要更改。如果只需要将 1 变为 0,则要&amp;。如果只需要将 0 改为 1,则要|。如果您需要双向更改,就像这里的情况一样,您需要^,因为它是唯一可以双向操作的运算符。

现在只需找到正确的位掩码进行异或。由于1^0=10^0=0,您必须在位掩码中将您不想更改的位设置为0。将其他设置为 1(1^1 为 0,0^1 为 1),您将得到您想要的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2021-05-14
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    相关资源
    最近更新 更多