倾天 发表于 2016-3-28 15:31:20

一元运算符的问题

unsigned setbits(unsigned x, int p, int n, unsigned y){
        return x & ~(~(~0 << n) << (p + 1 - n)) | (y & ~(~0 << n)) << (p + 1 - n);
}

这是C程序设计语言中联系题的答案,其中解释道:

~(~(~0 << n) << (p + 1 - n))

把屏蔽码最右边n个1左移到第p位
这是怎么实现的呢,为什么左移(p + 1 - n)就会左移到第p位呢?

muyu0096 发表于 2016-3-28 15:31:21

~(~0 << n)相当于1左移n位,然后取反,相当于把x的第n位置0,其他位不变。
<< (p + 1 - n)你可以看做先右移n位,然后再左移p+1位。
以上就是相当于把x的第n位置零,然后再把这个位移到0位(最右边一位,注意,是从0位而不是1位开始计算),再到左移p+1位
最后,是最终的取反,也就是把这个位从0置为1,其他的位置为0,相当于把x的第n位的屏蔽码移动到第p+1位,其他位置0.
我觉得不是移到到第p位,而是第p+1位,因为c里位置是从0而不是从1开始的。

倾天 发表于 2016-3-28 18:25:27

求解答

倾天 发表于 2016-3-28 20:00:19

求解答啊

倾天 发表于 2016-3-29 08:30:57

没人啊

jzh823 发表于 2016-3-29 08:54:36

没懂你的意思,逻辑的问题吧

爱,不解释 发表于 2016-3-31 09:25:22

求大神给方法

倾天 发表于 2016-4-2 17:35:43

muyu0096 发表于 2016-3-30 17:12
~(~0

谢啦

helloPY 发表于 2016-4-7 21:20:33

进来学习一下发现太深奥不懂
页: [1]
查看完整版本: 一元运算符的问题