关于位运算,请教一个问题

xuhb95083023 2014-10-22 04:31:30
如以下二进制结构
00001010
我想得到
00010000
即左移一位,然后除最高位之外,其它位都置为0
求实现,谢谢!
...全文
299 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-10-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
li4c 2014-10-23
  • 打赏
  • 举报
回复
引用 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在哪一位,所以用循环
FancyMouse 2014-10-23
  • 打赏
  • 举报
回复
这种事情还是参考hacker's delight靠谱一点。 印象里msb不像lsb有x&-x这种不需要循环/分治的做法的。
xuhb95083023 2014-10-22
  • 打赏
  • 举报
回复
引用 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;
貌似要循环才能搞定啊
li4c 2014-10-22
  • 打赏
  • 举报
回复
楼主看下面,找到灵感没有

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;
li4c 2014-10-22
  • 打赏
  • 举报
回复
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;
}
xuhb95083023 2014-10-22
  • 打赏
  • 举报
回复
引用 12 楼 xydp1987108 的回复:
1楼是对的 应该是00010100 &00010000 = 0001 0000 而不是00010100 & 00001010
00010000 怎么得到的,原始数据是00001010
xuhb95083023 2014-10-22
  • 打赏
  • 举报
回复
引用 6 楼 u013163178 的回复:
你的意思是永远保存左边的第一个1吗,不管他在第几位
是这个意思,只保存最左边一个1,且最左边的要左移一位
li4c 2014-10-22
  • 打赏
  • 举报
回复
死循环了,搞不不懂,谁能告诉为什么
/*************************************************************************
    > 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;
}
xydp1987108 2014-10-22
  • 打赏
  • 举报
回复
1楼是对的 应该是00010100 &00010000 = 0001 0000 而不是00010100 & 00001010
707wk 2014-10-22
  • 打赏
  • 举报
回复
#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;
}
勤奋的小游侠 2014-10-22
  • 打赏
  • 举报
回复
引用 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做运算?
xydp1987108 2014-10-22
  • 打赏
  • 举报
回复
错了 没看清移动一位
xydp1987108 2014-10-22
  • 打赏
  • 举报
回复
Data = (Data <<4)&0x80
hello_world000 2014-10-22
  • 打赏
  • 举报
回复
引用 4 楼 hello_world000 的回复:

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;
}
li4c 2014-10-22
  • 打赏
  • 举报
回复
你的意思是永远保存左边的第一个1吗,不管他在第几位
xuhb95083023 2014-10-22
  • 打赏
  • 举报
回复
引用 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 答案错!
hello_world000 2014-10-22
  • 打赏
  • 举报
回复

unsigned func(unsigned val)
{
	unsigned ret;
	val <<= 1;
	while (val)
	{
		ret = val;
		val &= (val - 1);
	}
	
	return ret;
}
勤奋的小游侠 2014-10-22
  • 打赏
  • 举报
回复
引用 2 楼 xuhb95083023 的回复:
[quote=引用 1 楼 lovesmiles 的回复:] short Data =0x0a;//定义 Data = Data<<1; //左移 Data = Data & 0x10;//只取最高位,其它位置0
这个和我原先想法一样,不过是错误的[/quote] 何解是错的?愿闻其详
xuhb95083023 2014-10-22
  • 打赏
  • 举报
回复
引用 1 楼 lovesmiles 的回复:
short Data =0x0a;//定义 Data = Data<<1; //左移 Data = Data & 0x10;//只取最高位,其它位置0
这个和我原先想法一样,不过是错误的
加载更多回复(1)

69,382

社区成员

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

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