按位运算设置十进制变量
bitwise operation to set decimal variable
我用位运算写了一个轻程序。
#include <stdio.h>
int main ()
{
int pos;
unsigned int aaregister = 0;
unsigned int result = 1;
aaregister = aaregister|(1 << 0);
printf("|0: %02X \n", aaregister);
aaregister = aaregister | 1 << 1;
printf("|1: %02X \n", aaregister);
aaregister = aaregister | 0 << 2;
printf("|2: %02X \n", aaregister);
aaregister = aaregister | 1 << 3;
printf("|3: %02X \n", aaregister);
for (pos = 3; pos>=0;pos--)
{
result = result & (aaregister & (1 >> pos));
printf(" %d \n", result);
printf("res : %02X \n", result);
}
return 0;
}
我的目的是将aaregister
设置为二进制值1011,然后根据位位置设置result
。
如果位 pos = 3 1
那么结果 = 1
如果 pos = 2 0
那么结果 = 0
如果 pos = 1 1
那么结果 = 1
如果位置 = 0 1
那么结果 = 1
但程序没有 return !!
c 程序有什么问题?
你移动了错误的部分:而不是将 1
向右移动(当 pos
不为零时将产生零)你应该向右移动 aaregister
,像这样:
result = result & ((aaregister >> pos) & 1);
此外,result
的声明需要在循环内移动,以便在每次迭代时将其重置回 1
(demo)。
现在您的程序可以运行了,这里有一些关于位操作的要点:
您不能通过 OR-ing 将零强制转换为数字 - 因此,aaregister | 0 << 1
操作毫无意义。为了强制为零,您需要使用倒数进行 AND,如下所示:
aaregister = aaregister & ~(1 << 1);
或更好
aaregister &= ~(1 << 1);
复合赋值使您的代码更易于阅读 - 而不是编写
aaregister = aaregister | 1 << 3;
写
aaregister |= (1 << 3);
可以在任何位置进行测试 - 如果您想检查位置 pos
是否已设置,请使用
if (aaregister & (1 << pos)) {
...
}
基于我认为预期输出的新答案:
#include <stdio.h>
int main ()
{
int pos;
unsigned int aaregister = 0;
unsigned int result = 0;
aaregister |= 1 << 0;
printf("|0: %02X \n", aaregister);
aaregister |= 1 << 1;
printf("|1: %02X \n", aaregister);
aaregister |= 0 << 2;
printf("|2: %02X \n", aaregister);
aaregister |= 1 << 3;
printf("|3: %02X \n", aaregister);
for (pos = 3; pos>=0;pos--)
{
result = (aaregister >> pos) & 1;
printf("Pos %d: res : %d\n", pos, result);
}
return 0;
}
输出为:
|0: 01
|1: 03
|2: 03
|3: 0B
Pos 3: res : 1
Pos 2: res : 0
Pos 1: res : 1
Pos 0: res : 1
设置位你可以使用这个逻辑
a=(1<<(pos-1))|a;
我用位运算写了一个轻程序。
#include <stdio.h>
int main ()
{
int pos;
unsigned int aaregister = 0;
unsigned int result = 1;
aaregister = aaregister|(1 << 0);
printf("|0: %02X \n", aaregister);
aaregister = aaregister | 1 << 1;
printf("|1: %02X \n", aaregister);
aaregister = aaregister | 0 << 2;
printf("|2: %02X \n", aaregister);
aaregister = aaregister | 1 << 3;
printf("|3: %02X \n", aaregister);
for (pos = 3; pos>=0;pos--)
{
result = result & (aaregister & (1 >> pos));
printf(" %d \n", result);
printf("res : %02X \n", result);
}
return 0;
}
我的目的是将aaregister
设置为二进制值1011,然后根据位位置设置result
。
如果位 pos = 3 1
那么结果 = 1
如果 pos = 2 0
那么结果 = 0
如果 pos = 1 1
那么结果 = 1
如果位置 = 0 1
那么结果 = 1
但程序没有 return !!
c 程序有什么问题?
你移动了错误的部分:而不是将 1
向右移动(当 pos
不为零时将产生零)你应该向右移动 aaregister
,像这样:
result = result & ((aaregister >> pos) & 1);
此外,result
的声明需要在循环内移动,以便在每次迭代时将其重置回 1
(demo)。
现在您的程序可以运行了,这里有一些关于位操作的要点:
您不能通过 OR-ing 将零强制转换为数字 - 因此,aaregister | 0 << 1
操作毫无意义。为了强制为零,您需要使用倒数进行 AND,如下所示:
aaregister = aaregister & ~(1 << 1);
或更好
aaregister &= ~(1 << 1);
复合赋值使您的代码更易于阅读 - 而不是编写
aaregister = aaregister | 1 << 3;
写
aaregister |= (1 << 3);
可以在任何位置进行测试 - 如果您想检查位置 pos
是否已设置,请使用
if (aaregister & (1 << pos)) {
...
}
基于我认为预期输出的新答案:
#include <stdio.h>
int main ()
{
int pos;
unsigned int aaregister = 0;
unsigned int result = 0;
aaregister |= 1 << 0;
printf("|0: %02X \n", aaregister);
aaregister |= 1 << 1;
printf("|1: %02X \n", aaregister);
aaregister |= 0 << 2;
printf("|2: %02X \n", aaregister);
aaregister |= 1 << 3;
printf("|3: %02X \n", aaregister);
for (pos = 3; pos>=0;pos--)
{
result = (aaregister >> pos) & 1;
printf("Pos %d: res : %d\n", pos, result);
}
return 0;
}
输出为:
|0: 01
|1: 03
|2: 03
|3: 0B
Pos 3: res : 1
Pos 2: res : 0
Pos 1: res : 1
Pos 0: res : 1
设置位你可以使用这个逻辑
a=(1<<(pos-1))|a;