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: 引用 17 楼 u013163178 的回复:楼主看下面，找到灵感没有 00100100&1 ->00000000; 00100100& 10 -> 00000000; 00100100& 100 ->00000100; 00100100& 1000 ->00000000; 00100100& 10000 ->00000000; 00100100& 100000 ->0010000;//就是这个把， 00100000<<1    -> 01000000 00100100& 1000000 ->00000000; 00100100& 00000000 -> 00000000; 是啊，因为不知道左边的第一个1在哪一位，所以用循环

user: user-3
content: 这种事情还是参考hacker's delight靠谱一点。 印象里msb不像lsb有x&-x这种不需要循环/分治的做法的。

user: user-0
content: 引用 17 楼 u013163178 的回复:楼主看下面，找到灵感没有 00100100&1 ->00000000; 00100100& 10 -> 00000000; 00100100& 100 ->00000100; 00100100& 1000 ->00000000; 00100100& 10000 ->00000000; 00100100& 100000 ->0010000;//就是这个把， 00100000<<1    -> 01000000 00100100& 1000000 ->00000000; 00100100& 00000000 -> 00000000;  貌似要循环才能搞定啊

user: user-2
content: 楼主看下面，找到灵感没有 00100100&1 ->00000000; 00100100& 10 -> 00000000; 00100100& 100 ->00000100; 00100100& 1000 ->00000000; 00100100& 10000 ->00000000; 00100100& 100000 ->0010000;//就是这个把， 00100000<<1    -> 01000000 00100100& 1000000 ->00000000; 00100100& 00000000 -> 00000000;

user: user-2
content: unsigned char fun(unsigned char val) {     unsigned char tmp = 0X1;     unsigned char a;     while(tmp != 0);     {         if(tmp & val)         {             a = tmp & val;             tmp = tmp<<1;         }         else             tmp = tmp<<1;     }     return a; }

user: user-0
content: 引用 12 楼 xydp1987108 的回复:1楼是对的   应该是00010100 &00010000 = 0001 0000  而不是00010100 & 00001010  00010000 怎么得到的，原始数据是00001010

user: user-0
content: 引用 6 楼 u013163178 的回复:你的意思是永远保存左边的第一个1吗，不管他在第几位  是这个意思，只保存最左边一个1，且最左边的要左移一位

user: user-2
content: 死循环了，搞不不懂，谁能告诉为什么 /*************************************************************************     > File Name: hello.c     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年10月22日 星期三 18时10分02秒  ************************************************************************/  #include<stdio.h> int main() { 	unsigned char fun(unsigned char val); 	unsigned char n = 0X1; 	printf("%x\n",fun(n)); 	return 0; }  unsigned char fun(unsigned char val) { 	unsigned char tmp = 0X1; 	unsigned char a; 	while(tmp != 0); 	{ 		if(tmp & val) 		{ 			a = tmp & val; 			tmp = tmp<<1; 		} 		else 			tmp = tmp<<1; 	} 	return a; }

user: user-4
content: 1楼是对的   应该是00010100 &00010000 = 0001 0000  而不是00010100 & 00001010

user: user-5
content: #include <stdio.h> unsigned char setfirstzero(unsigned char num) {     int len=0;     while(num!=0x01)     {         len++;         num=num>>1;     }     num=num<<len;     return num; }  int main() {     unsigned char num=0x11;     printf("%x\n",setfirstzero(num));     return 0; }

user: user-6
content: 引用 5 楼 xuhb95083023 的回复:[quote=引用 3 楼 lovesmiles 的回复:] [quote=引用 2 楼 xuhb95083023 的回复:] [quote=引用 1 楼 lovesmiles 的回复:] 	short Data =0x0a;//定义 	Data = Data<<1; //左移 	Data = Data & 0x10;//只取最高位，其它位置0  这个和我原先想法一样，不过是错误的[/quote] 何解是错的？愿闻其详[/quote]  00001010 左移1位变成 00010100  00010100 & 00001010 = 00000000  你这红色 的是移位后的结果data,绿色的是什么东西？我的并运算是0x10，也就是00010000.和你的不一样。   答案错！[/quote]  看清楚了，你为什么还会和00001010做运算？

user: user-4
content: 错了 没看清移动一位

user: user-4
content: Data  = (Data <<4)&0x80

user: user-7
content: 引用 4 楼 user-7 的回复: unsigned func(unsigned val) { 	unsigned ret; 	val <<= 1; 	while (val) 	{ 		ret = val; 		val &= (val - 1); 	} 	 	return ret; }   修改下：  unsigned func(unsigned val) { 	unsigned ret = 0; 	val <<= 1; 	while (val) 	{ 		ret = val; 		val &= (val - 1); 	} 	 	return ret; }

user: user-2
content: 你的意思是永远保存左边的第一个1吗，不管他在第几位

user: user-0
content: 引用 3 楼 lovesmiles 的回复:[quote=引用 2 楼 xuhb95083023 的回复:] [quote=引用 1 楼 lovesmiles 的回复:] 	short Data =0x0a;//定义 	Data = Data<<1; //左移 	Data = Data & 0x10;//只取最高位，其它位置0  这个和我原先想法一样，不过是错误的[/quote] 何解是错的？愿闻其详[/quote]  00001010 左移1位变成 00010100  00010100 & 00001010 = 00000000   答案错！

user: user-7
content: unsigned func(unsigned val) { 	unsigned ret; 	val <<= 1; 	while (val) 	{ 		ret = val; 		val &= (val - 1); 	} 	 	return ret; }

user: user-6
content: 引用 2 楼 xuhb95083023 的回复:[quote=引用 1 楼 lovesmiles 的回复:] 	short Data =0x0a;//定义 	Data = Data<<1; //左移 	Data = Data & 0x10;//只取最高位，其它位置0  这个和我原先想法一样，不过是错误的[/quote] 何解是错的？愿闻其详

user: user-0
content: 引用 1 楼 lovesmiles 的回复:short Data =0x0a;//定义 	Data = Data<<1; //左移 	Data = Data & 0x10;//只取最高位，其它位置0  这个和我原先想法一样，不过是错误的