关于位运算的一个程序,怎么结果不对呢?

drizztguai 2008-02-13 06:19:45
程序的目的是把一个数复制到目标数某段位域内.

如果 将0x123 复制到 0xffff 的 13-9位里.( 位数从右向左数, 0开始. ) 则返回结果: 0xc7ff

可是什么地方出了错~

#include <stdio.h>
#include <stdlib.h>

int
store_bit_field ( int original_value , int value_to_store ,
unsigned int start_bit , unsigned int end_bit );

int
main ( void )
{
int new_value;
new_value = store_bit_field ( 0x0 , 0x1 , 3 , 3 );
printf ("%x\n" , new_value );

return EXIT_SUCCESS;
}


int
store_bit_field ( int original_value , int value_to_store ,
unsigned int start_bit , unsigned int end_bit )

/*
** 将一个整数插到另一个整数的某段位域内
*/
{
int new_value;
/*
** 构造个演码,需要被复制位域全为0,其他全为1
*/
int mask =
~ ( ( (~(unsigned int)0) >> (31 - start_bit) ) << end_bit );

value_to_store <<= end_bit; /* 将需要被复制的东西对准 地方 */
mask = mask & original_value; /* 将地方腾出来 */
value_to_store |= mask; /* 将要复制的东西挖出 */
new_value = mask & value_to_store; /* 复制进去 */

return new_value;
}
...全文
154 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-02-13
  • 打赏
  • 举报
回复
我还没来得及看呢,看来不用看了。
drizztguai 2008-02-13
  • 打赏
  • 举报
回复
晕.

已解决:
new_value = mask & value_to_store; /* 复制进去 */
--- >
new_value = mask | value_to_store; /* 复制进去 */
drizztguai 2008-02-13
  • 打赏
  • 举报
回复
实现 将0x123 复制到 0xffff 的 13-9位里.( 位数从右向左数, 0开始. ) 则返回结果: 0xc7ff

是指个例子噢.

我关键是想得到int
store_bit_field ( int original_value , int value_to_store ,
unsigned int start_bit , unsigned int end_bit )
这个函数的具体写法.
drizztguai 2008-02-13
  • 打赏
  • 举报
回复
谢谢.

但是能稍微给我解释下这个式子是什么意思么?

0x2e00 , 0x1f 是怎么得到的 ?
xffff 可以做左值么?


cnzdgs 2008-02-13
  • 打赏
  • 举报
回复
xffff = (xffff & ~0x2e00) | ((x123 & 0x1f) << 9)

69,371

社区成员

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

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