69,373
社区成员
发帖
与我相关
我的任务
分享
#include "stdio.h"
int main()
{
char sz[65];
int n = 8;
itoa(n, sz, 2);
printf("%032s\n", sz);
if ((n >> 2) & 0x1)
n &= 0xfffffffb;
else
n |= 0x4;
if ((n >> 6) & 0x1)
n &= 0xffffffbf;
else
n |= 0x40;
if ((n >> 7) & 0x1)
n &= 0xffffff7f;
else
n |= 0x80;
itoa(n, sz, 2);
printf("%032s\n", sz);
return 0;
}
#include <stdio.h>
#define WIRTE_UINT(des ,x ,pos ,len) ( \
(des) \
& \
~( /* 除要修改的位为0,其余都为1 */ \
( \
(1<<(len))-1 /* 长度为len位的1 */ \
) \
<<(32-(pos)-(len)) /* 左移32-(pos)-(len)位 */ \
) \
| \
( \
(x) \
<<(32-(pos)-(len)) \
) \
)
#define READ_UINT(src ,pos ,len) ( \
( \
( \
(unsigned)(src) \
) \
>>(32-(pos)-(len)) /* 逻辑右移32-(pos)-(len)位 */ \
) \
& \
( \
(1<<(len))-1 /* 长度为len位的1 */ \
) \
)
int main() // 1111111111222222222233
{ //bit 01234567890123456789012345678901
unsigned int des = 0x661; // 00000000000000000000011001100001
unsigned int r;
des = WIRTE_UINT(des ,3 ,28 ,2); // 00000000000000000000011001101101
printf("des==0x%08X\n",des);
r = READ_UINT(des ,28 ,2);
printf("r==%d\n",r);
return 0;
}
//des==0x0000066D
//r==3
#include "stdio.h"
int main()
{
char sz[65];
int n = 8;
itoa(n, sz, 2);
printf("%032s\n", sz);
if ((n >> 2) & 0x1) //右移两位,然后与上1,判断,目的就是判断第‘2’位是否为1
n &= 0xfffffffb; //如果第‘2’位是1,则第‘2’位与上0,就是将第‘2’位置0
else
n |= 0x4; //如果第‘2’位是0,则置第‘2’位为1
//看来上一段的意思很明显了,反转第‘2’位,下面的这些也类似。反转指定的位。
if ((n >> 6) & 0x1)
n &= 0xffffffbf;
else
n |= 0x40;
if ((n >> 7) & 0x1)
n &= 0xffffff7f;
else
n |= 0x80;
itoa(n, sz, 2);
printf("%032s\n", sz);
return 0;
}
我如果想改变第n位(0为起始位)的二进制数,像上面一样,我应该怎么限制if中的代码呢?
----------
限制if中的代码,指的是 if ((n >> 6) & 0x1),中的6?想改变第N位,就是N。
如果是:
n &= 0xffffffbf;则是相应的位设成0,其余的位设成1
else
n |= 0x40; 相应的位设成1,其余的位设成0
#include "stdio.h"
int main()
{
char sz[65];
int n = 8;
itoa(n, sz, 2);
printf("%032s\n", sz);
if ((n >> 2) & 0x1)//如果第3位为1,则变0
n &= 0xfffffffb;//前面是f全是1, b=1011,显然与后,第3位变成0其余位不变
else//为0变成1
n |= 0x4;//4=0100,或运算,保留第三位的1,其余位不变
if ((n >> 6) & 0x1)//第7位,同理
n &= 0xffffffbf;
else
n |= 0x40;
if ((n >> 7) & 0x1)//第8位,同理
n &= 0xffffff7f;
else
n |= 0x80;
itoa(n, sz, 2);
printf("%032s\n", sz);
return 0;
}
int n, pos;
if( n>pos & 0x01 ){
n &= ~( 0x01 < pos );
}
else{
n |= ( 0x01 < pos );
}