我目前正在研究一个问题,即我试图操作位串中的位。
我正在尝试使用以下信号掩码:
00101001
并使用AND和OR运算符对作为整数给出的信号掩码进行检查。
我目前有一些代码采用无符号字符并打印出二进制表示,但我不知道如何继续。
main() {
int signal = 2;
unsigned char a = 41;
int i;
for (i = 0; i < 8; i++) {
printf("%d \n", !!((a << i) & 0x80));
}
printf("\n");
return 0;
}
注意:在运行时只会检查一个给定的信号编号。
有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
如果我正确地解释了您的问题,那么您想做的只是按位,并且在a
和signal
之间:
if ( a & signal ) {
printf( "Signal bit is set\n" );
} else {
printf( "Signal bit is not set\n" );
}
对于值a = 41
和signal = 2
,上面会输出Signal bit is not set
,因为41
没有设置与信号位置相同的位。
如果a = 42
或a = 43
输出Signal bit is set
。
答案 1 :(得分:2)
如果信号掩码以二进制表示形式作为字符串提供给程序,则可以使用strtol
进行转换:
const char *maskstring = "00101001";
unsigned int mask = strtol(maskstring, NULL, 2);
printf("hexmask for binary %s is %#x\n, maskstring, mask);
如果掩码是常量,请自行转换并使用十六进制值。
答案 2 :(得分:0)
// input integer with current signal bits
unsigned int signalBits = atoi(signalString);
unsigned int signalOfInterest;
// note signalOfInterest will contain a 'power of 2' value
// such as 1 or 2 or 4 or 8 or 16 or 32 or 64, etc
// which represent the various possible signal bits
// test if signal bit is set
if( signalBits&signalOfInterest )
{ // then signal bit is set
}
else
{ // else, signal bit is not set
}
答案 3 :(得分:0)
程序的目的应该是给出给定的信号编号,除了作为信号编号的数字位之外,将所有位设置为0,并使用AND运算符根据是否设置信号来确定信号是否设置值为0或1。
您希望从信号编号 n 中获取位掩码,这可以通过将1
左移到第n 位置来实现。然后应用简单的&
(按位和)来检查该位是否已设置。
int checkSignal(unsigned int value, unsigned char signalNumber){
unsigned int bitMask = 1 << signalNumber;
return (value & bitMask) != 0;
}
signalNumber
存储为单个字节,假设int
位大小不能大于255;理想情况下,您应检查它是否不大于sizeof(int) * 8
。
请注意,第一个信号位在索引0处,因此根据编号约定,您可能需要将1
移除到信号编号。
int checkSignal(unsigned int value, unsigned char signalNumber){
unsigned int bitMask = 1 << (signalNumber - 1); // number starts at 1
return (value & bitMask) != 0;
}
测试:
main() {
int signal = 2;
unsigned char a = 41;
/*
int i;
for (i = 0; i < 8; i++) {
printf("%d \n", !!((a << i) & 0x80));
}
printf("\n");
*/
printf("%dth bit of %d is %s set\n", signal, a, checkSignal(a, signal)?"":"not");
return 0;
}