user-0 提问: 获取一个int变量某一位的bit值，试问以下GetBit函数有问题吗？

回复:
user: user-1
content: 引用 10 楼 AnYidan 的回复:右移int, 底层对应有两种汇编指令，逻辑右移和算术右移 #include <stdio.h> unsigned char ui;   signed char si; char main() {     ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=ui>>1;     si=si>>1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      printf("--------------\n");     ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=((  signed char)ui)>>1;     si=((unsigned char)si)>>1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      printf("==============\n");      ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=ui<<1;     si=si<<1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      printf("--------------\n");     ui=(unsigned char)0x80u;     si=(  signed char)0x80;     printf("ui=%u\n",ui);     printf("si=%d\n",si);     ui=((  signed char)ui)<<1;     si=((unsigned char)si)<<1;     printf("ui=%u\n",ui);     printf("si=%d\n",si);      return 0; } //ui=128 //si=-128 //ui=64 //si=-64 //-------------- //ui=128 //si=-128 //ui=192 //si=64 //============== //ui=128 //si=-128 //ui=0 //si=0 //-------------- //ui=128 //si=-128 //ui=0 //si=0

user: user-2
content: /*unsigned char GetBit(int num,int bit) {     if(bit < 0 || bit > 31)         return -1;     else         return num>>bit&0x01; }*/ // 这个函数可以简单点的，或者都可以不用单独写个函数了！ int GetBit(int num, int pos) {     return (num & (1 << pos)); }

user: user-3
content: int不一定是32位

user: user-4
content: 右移int, 底层对应有两种汇编指令，逻辑右移和算术右移

user: user-0
content: 这是上次我去一个公司的一个笔试题，我写成了这样，勉强及格，我不知道问题出在什么地方？还有什么没有考虑吗？求高手指点。

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-0
content: 引用 5 楼 buyong 的回复:还有考虑int 的符号位 不管int的最高位是什么，总之移位之后都会放在最低位，然后和0x01求与，结果应该不会错吧。恕我愚昧，没明白你所说的是什么意思。

user: user-0
content: 引用 3 楼 turingo 的回复:最好加括号：return (num>>bit)&0x01;  [quote=引用 楼主 Mr_warm 的回复:] #include <stdio.h> unsigned char GetBit(int num,int bit) {     if(bit < 0 || bit > 31)         return -1;     else         return num>>bit&0x01; }  int main(void) {     int num = 0x84218421;     int index = 32;     int i = 0;     for(i = 0; i < 32;)     {         printf("0x%x ",GetBit(num,i));         if((++i)%4 == 0)         {             putchar('\n');         }     }     getch();     return 0; } [/code]   求高手指点！[/quote] 嗯，这个以后注意。

user: user-0
content: 引用 4 楼 bluebai123 的回复:注意，某一个bit的值，你这返回的是个uchar类型，是一个字节呀 它只表示0或者1，关键是c语言里没有表示bit这样的数据类型啊！

user: user-5
content: 还有考虑int 的符号位

user: user-6
content: 注意，某一个bit的值，你这返回的是个uchar类型，是一个字节呀

user: user-7
content: 最好加括号：return (num>>bit)&0x01;  引用 楼主 Mr_warm 的回复:#include <stdio.h> unsigned char GetBit(int num,int bit) {     if(bit < 0 || bit > 31)         return -1;     else         return num>>bit&0x01; }  int main(void) {     int num = 0x84218421;     int index = 32;     int i = 0;     for(i = 0; i < 32;)     {         printf("0x%x ",GetBit(num,i));         if((++i)%4 == 0)         {             putchar('\n');         }     }     getch();     return 0; } [/code]   求高手指点！