user-0 提问: 有什么简单的方法操作位？

回复:
user: user-1
content: #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

user: user-2
content: 位逻辑是最好的方法，LZ还要追求什么？  置位：| 00010000 复位：& 11101111 取反：^ 00010000

user: user-3
content: C语言麻烦点，C++可以用标准库的vector<bool>类型

user: user-4
content: 引用 4 楼 AnYidan 的回复:也可以用mask, 比如你想读第一位  #define MASK_1 (1 << 1)  if (n & MASK != 0)  { 第一位是1}  大姐,楼主说了,读不是问题,写才是问题

user: user-5
content: 引用 7 楼 gz_qmc 的回复:[quote=引用 4 楼 AnYidan 的回复:] 也可以用mask, 比如你想读第一位  #define MASK_1 (1 << 1)  if (n & MASK != 0)  { 第一位是1}  大姐,楼主说了,读不是问题,写才是问题[/quote]  一样可以用 mask,  置位： n |= MASK; 复位： n &= ~MASK;

user: user-6
content: 一般来说，将某一位置为0或者1或者取反，用的是与、或、异或这三种操作。

user: user-7
content: 如果楼主真要另类的访求,我可以说一下 用一下标准库的中bitset吧,像操作数组一样,操作二进制位

user: user-5
content: 也可以用mask, 比如你想读第一位  #define MASK_1 (1 << 1)  if (n & MASK != 0)  { 第一位是1}

user: user-8
content: 定义个数组 int bit[] = {1, 2, 4, 8, 16, 32, 64, .... }; 然后用bit[0~32]去与就好啦

user: user-4
content: 如果你细心,你还可以发现 N1~N8不需要记  因为: N1=~Y1;(按位取反)  所以,第三位置0还可表示为 n&=~Y3

user: user-4
content: 首先你要知道你的数据是多少位的 比如char n=52; 是8位的 00110100   =52;  00000001   =1=0x01; 00000010   =2=0x02; 00000100   =4=0x04; 00001000   =8=0x08; 11111011   =251=0xFB; 那么第四位置为1的表达方式就是 n=n|0x08;优化成n|=0x08; 那么第三位置为0的表达方式就是 n&=0xFB;  如果你不熟悉进制转换 并且你已经懒到连背这几个特殊数据都不愿意的程度了  那么你自己写个.h程序 #define  Y1 0x01 #define  Y2 0x02 ........ #define  N3 0xFB 然后用的时候就简单了 那么第四位置为1的表达方式就是 n|=Y4; 那么第三位置为0的表达方式就是 n&=N3;