c/c++ 改变二进制位

不倒的土豆 2013-08-23 10:41:15
#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;
}



求大神讲解上面移位代码
原帖:http://bbs.csdn.net/topics/370228160
我如果想改变第n位(0为起始位)的二进制数,像上面一样,我应该怎么限制if中的代码呢?
...全文
335 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
不倒的土豆 2013-08-26
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
引用 3 楼 linxren 的回复:
引用 5 楼 my_live_123 的回复:
坏了色彩没有显示 上面 b = 1011
引用 6 楼 zjq9931 的回复:
大家讲的都很好啊。3楼的位移符号不同,我相信他是故意写成“<”的。把大家的方法都记下了。多谢大家!
赵4老师 2013-08-23
  • 打赏
  • 举报
回复
#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
不倒的土豆 2013-08-23
  • 打赏
  • 举报
回复
或者有其他方法也可以分享下。谢谢!
  • 打赏
  • 举报
回复
讲解:

#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
一根烂笔头 2013-08-23
  • 打赏
  • 举报
回复
坏了色彩没有显示 上面 b = 1011
一根烂笔头 2013-08-23
  • 打赏
  • 举报
回复

#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;
}
linxren 2013-08-23
  • 打赏
  • 举报
回复

int n, pos;
if( n>pos & 0x01 ){
    n &= ~( 0x01 < pos );
}
else{
    n |= ( 0x01 < pos );
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧