关于按位与和按位或以及左/右移的相关知识

来源:互联网 发布:c语言中的temp 编辑:程序博客网 时间:2024/05/16 07:36

1、按位与(&)与普通的与(&&)的一些不同之处:

(1)按位与(&)是每个相应的比特位都进行与操作,在比较时依然遵循0&&1=0&&01&&0=0,1&&1=1原则。而与(&&)操作是整体进行比较时遵循0&非零=0,非零&非零=1原则。

(2)举例:char a=10;char b=3;求a&&b,与a&b;

             解:二进制的表示形式为:a:00001010

                                                        b:00000011

                   与操作的结果为:1(因为10和3都可以表示为真,所以与操作后的结果也是真即1)

                   按位与操作结果为:00000010==2; 

注:按位或与或操作也是相应的道理,读者可以自行判断。


2、移位操作:

  左移操作是把每个比特位向左移动一个单位而最高位则自动补充一个0,右移操作是每个比特位向右移动一位从而在最低位补充一个0;所以左移相当于除2,右移相当于乘2。


3、按位操作经常会与左移(<<)和右移(>>)操作结合到一起进行操作。

例如:实现一个对8bit数据的指定位的置0或置1操作,并保持其他位不变。

解:相应的程序代码如下:

正确代码是标有(1)的两句代码,有的人会觉得(2)代码理解起来也对啊,为什么是错误的呢?那你就犯了一个常识性的错误,如果你把*p_data进行移位处理的话,那么你的原值会进行改变,那如果执行完(2)语句后再加上(3)语句把p_data移回来不行么,这里要清楚一点,就是你移位操作补上去的都是0,而不再是原来的数字了,比如1011先右移两位变成0010再左移两位变成1000而不再是原来的1011了,所以只能对1进行移位操作,因为1除了最后一位其余的都是0所以可以随意的移位。


若上述讲述的有什么不对的地方,或者有什么可以改进的地方 欢迎在下方的评论区写下您的意见,我会及时回复并更正,谢谢。


阅读全文
0 0