打印

怎样最高效地置位一个字节中的特定几位?

[复制链接]
4286|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jjldc|  楼主 | 2009-1-21 13:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原来的数:                1 1 1 1 0 0 0 0   
需要修改的某些位的值 0 x x 1 1 x 1 x
某种算法                   -------------
结果:                      0 1 1 1 1 0 1 0

搞晕了 大家来帮帮我吧~~~~~~~

相关帖子

沙发
computer00| | 2009-1-21 13:59 | 只看该作者

只能分两步吧...先清需要清的,再置需要置的……

使用特权

评论回复
板凳
刘前辈| | 2009-1-21 14:57 | 只看该作者

数字逻辑/布尔代数。

布尔代数:高二课程。
数字逻辑:大二课程。

假定设原来的数A,需要修改的数B,结果C。

已知A、C,求B。

∵  A ⊕ B = C

∴  A ⊕ C = B

∴  B = 11110000 ⊕ 01111010 =10001010

(  ⊕: 逻辑加/异或 )

使用特权

评论回复
地板
computer00| | 2009-1-21 15:10 | 只看该作者

哈哈……楼主要的结果是让某些位是确定值吧?

而不是对某些位简单地取反而已?

如果只是对某些位取反,那就是3楼所说的,异或操作。异或操作的结果是:跟0异或结果保持不变,跟1异或结果取反。

使用特权

评论回复
5
刘前辈| | 2009-1-21 15:41 | 只看该作者

看错题了。修改一下。

高4位为同或运算⊙,即:

∵ AH ⊙ CH = BH

∴ BH = AH ⊙ CH = 1111 ⊙ 0111 = 0111


低4位为异或运算⊕,即:

∴ BL = AL ⊕ CL = 0000 ⊕ 1010 =1010

又∵ ⊕ = / ⊙


∴  B = 11110000 ⊕ 01111010 =10001010

结果 = /BH + BL (高4位反相);汇编指令一共2条。

1、XOR A, C
2、XOR A,#11110000

使用特权

评论回复
6
computer00| | 2009-1-21 15:58 | 只看该作者

我觉得,在这里A显示是未知的

如果A是已知的,那就没有意义了,因为可以直接知道C,不用通过运算。

楼主的要求是:将最D7位置0,D1、D3、D4位置1,其它位不变。

因此,可以按照以下步骤操作:

x=x&(~0x80);  //将D7位置0,其它位不变
x=x|(0x1A);   //将D1、3、4位置1

使用特权

评论回复
7
刘前辈| | 2009-1-21 17:45 | 只看该作者

呵呵,又看错题了。

没注意到此题的A=11110000. 和高4位异或反相运算因子一样!

那么根据2条汇编指令:

结果B =A⊕C⊕11110000 = A⊕C⊕A = A⊕A⊕C = 0⊕C = C

和5楼的答案BH+BL 相同。

哈,需要修改的值B,修改后,结果就是C。B = C =01111010.

使用特权

评论回复
8
hotpower| | 2009-1-21 21:59 | 只看该作者

&|^~

使用特权

评论回复
9
dengm| | 2009-1-22 09:35 | 只看该作者

R = (A AND (NOT B)) OR B

使用特权

评论回复
10
jjldc|  楼主 | 2009-1-22 11:11 | 只看该作者

谢谢各位

搞好了,可能我没说清楚
A@B=C
其中A和B都是未知的,但需要修改的位是已知的
先定义一个MASK,其中为1的位是需要修改的位,楼主位的例子MASK=10011010

我的方法是:
先清零A中需要更改的位
D=A&(~MASK)
然后清零B中无关位
E=B&MASK
然后D和E或,将A中被第一步清零的位中需要置1的位置1(好拗口~~)
RES = D&E = [A&(~MASK)] | (B&MASK)
用了三步。。。 
不知道有没有更简单的方法咯。。。。

使用特权

评论回复
11
computer00| | 2009-1-22 11:38 | 只看该作者

没有了。

使用特权

评论回复
12
刘前辈| | 2009-1-23 20:32 | 只看该作者

真逗。

那么假定我原来A=10001010,B=01100001;

请问经过楼主的运算之后,RES=? 

RES=00000000|00000000=00000000;

该置1的没置1呀?

使用特权

评论回复
13
bg6nw| | 2009-1-23 21:07 | 只看该作者

先与后或

原数和这个数 10011010 相与,目的是先把需要修改的几位清零

另一个需要插入的数先和01100101 相与,目的是先清掉不需要改的数

它们两个再‘或’一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

23

帖子

0

粉丝