本文假设计算机就是8位的,这样好举例。
首先要知道 操作的是那一位,比如如下的第2位。
1)。如操作数:a=01101000 我想要这个数的右边第二个位置是1。。。则本质上我在对应位置给一个1.然后其他位置都是0,然后再或。就可以。就是:
第一步;人为构造一个第二个位置一个1。。。就是1<<1…变成00000010
第二步;把a 和构造处理的00000010 或一下子就是
01101000
00000010
则可以知道结果就是01101010 就达到了修改操作数a第二位是1的目的,就是置位1.
用表达式就是:
a = a | (1<<1)
用那种骚写法就是
a |= (1<<1)
2)。上述操作数a 我们修改的是原来位置上0变成1。。。有一半的说服力。假设我不知道那个位置是0,还是1。。。我就想让最终结果变成1.
则举例如:b = 01101010 我想修改右边第二位是1(这里假设不知道原来这个位置是1)
第一步:人为给出一个数 1,左移1位(就是右边第二位). 1<<1 就是: 00000010
第二步:和b 货一下子
01101010
00000010
则可知结果就是01101010 就达到了修改第二个位置的目的。(假设原来不知道第二位置是1,就想置1)
总结1:综上可见,想要某个位置置1.就是先左移构造,因为左移右边补0,就是单纯的左移多少位,就是对应位置是1。。。。。。剩下位置是0.跟原来的 一 或或。。。原来的其他位置和0或,不变。要改变的位置是1,则不论原来位置是0还是1,我们都是1.
1),如操作数a = 10101100 要修改右边第四位成0
第一步:构造数,把1左移3位。 1<<3 变成00001000
第二步:取反(为了不影响原操作数) 则变成 11110111
第三步,拿构造出来的数和a进行与操作
10101100
11110111
则结果是10100100 和原来的a对比就是修改了第四位是0
2),假设原本位置就是0,但是我不知道,我还想把他改成0
如操作数a=00101101 我想修改第五位成0(这里装看不见第五位是0)
则:
第一步:构造书 1<<4 变成00010000
第二步:取反 11101111
第三步:与操作
00101101
11101111
结果是00101101
就修改成功。
总结2:想要清零,就要首先保证对应位是0,然后和操作数与。这样无论原来位置是0还是1,都会变成0。。。。但是同时还要保证人家原来的操作数不变,怎么能够在与的时候原来的不变? 答案就是其他位设置成1。。。。所以我们需要构造一个,对应位是0,其余位是1的操作数。所以还需要把1左移多少位之后的结果取反,就OK。