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