Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 协助基本位操作_C_Bit Manipulation - Fatal编程技术网

C 协助基本位操作

C 协助基本位操作,c,bit-manipulation,C,Bit Manipulation,这是我先前在这里回答的问题的后续问题: 我似乎遇到的问题是理解C语言中位操作的基本概念。我知道需要做什么,但实际上我很难找到解决方案 例如: 使用逻辑运算符将011010更改为00111110 我了解实现解决方案所需的掩码的原理和需求,但不知道如何通过编程实现 我来自基础深厚的C语言背景,最近才开始使用C语言进行开发 有人能给我一些提示或提示来完成这个例子吗 以下是其他人认为有用的解决方案: #include <stdio.h> #include <stdlib.h> #

这是我先前在这里回答的问题的后续问题:

我似乎遇到的问题是理解C语言中位操作的基本概念。我知道需要做什么,但实际上我很难找到解决方案

例如:

使用逻辑运算符将011010更改为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;
}

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

01101010 XOR 00111110 = 01010100
您可以将它们异或在一起。如果正好有一位为1,则两位的异或为1

01101010 XOR 00111110 = 01010100
我将这样继续:首先看看哪些位需要更改。如果只需要将1s更改为0s,则需要&。如果只需要将0更改为1,则需要|。如果您需要在两个方向上进行更改,就像这里的情况一样,您需要^


现在只需要找到正确的位掩码来使用xor。由于1^0=1和0^0=0,您必须在位掩码中将不希望更改的位设置为0。将其他值设置为1,1^1为0,0^1为1,您将得到所需的结果。

我将这样继续:首先看看哪些位需要更改。如果只需要将1s更改为0s,则需要&。如果只需要将0更改为1,则需要|。如果您需要在两个方向上进行更改,就像这里的情况一样,您需要^


现在只需要找到正确的位掩码来使用xor。由于1^0=1和0^0=0,您必须在位掩码中将不希望更改的位设置为0。将其他值设置为1,1^1为0,0^1为1,您将得到您想要的结果。

当我使用C时,我从来没有需要降低到这么低的值,但知道这一点很好。您希望最近编辑的输出是什么?不要将值打印为字符,这样会显示文本。您不能直接从C以二进制打印,但十六进制可能有助于从十六进制转换为二进制比从十进制更容易。使用printf%x,c;以十六进制打印。@unwind:太好了,我添加了我的解决方案,结果3e是十六进制,转换成十进制是62。谢谢你的提示。当我使用C语言时,我从来没有必要降低到这么低的水平,不过知道这一点很好。你希望最近编辑的输出是什么?不要将值打印为char,这样会显示文本。您不能直接从C以二进制打印,但十六进制可能有助于从十六进制转换为二进制比从十进制更容易。使用printf%x,c;以十六进制打印。@unwind:太好了,我添加了我的解决方案,结果3e是十六进制,转换成十进制是62。谢谢你的提示。你能解释一下你发布的C代码中的最终语句吗?确切地说,c^a==a^b^a&&a^b^a==b位。我想我明白了,但我只是想澄清一下它的目的,这样我就不会误解了。没有真正的目的。这只是一个有效的C true表达式,用于演示语法和重述我们所做的工作。您能解释一下您发布的C代码中的最终语句吗?确切地说,c^a==a^b^a&&a^b^a==b位。我想我明白了,但我只是想澄清一下它的目的,这样我就不会误解了。没有真正的目的。它只是一个有效的C true表达式,用于演示语法和重述我们所做的工作。
char a = 0x6A;
char b = 0x3E;
char c = a ^ b;

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