位运算中关于如何处理带符号整数类型的符号位并没有明确的规定,具体的要视平台而定,不过无符号类型就不存在这种问题了。
位运算的话,个人比较推荐matrix 67 写的关于位运算的博客,一共有四篇,名称如下:
(建议直接输入” 博客名+matrix67 “进行查找)
这四篇博文的程序部分大部分使用pascal,不过都比较直白、简单,对学习其他语言的人来说,问题也不大(实在看不懂,只看解析也行)。
在这里也推荐一下matrix67的博客,个人觉得这是我看过的最好的博客了,原因有两点:
①matrix67是大牛,他的博客自然也是深度与广度兼备。
②mareix67的博客直白易懂,很多人确实很大牛,对于某个算法理解的很深入,但往往一写出来,能意思清楚、连贯、直白、易懂的就真没多少了,毕竟搞IT的很多都是理工科出身,语文实在不咋地。(ps:matrix67是文科里的理科生)
在看了一堆资料后,在这里简要的把位运算的一些用处罗列一下,也好有个整体的概念:
1、位运算是直接的底层操作,合理使用位运算可以大大加快程序的运行速度。
比如:a=a*2 改成 a<<=1,a=a/2 改成 a>>=1;
2、位运算与集合。具体表现在用二进制的数位来代表某一元素,用一个数字来代表一个集合。
比如:有1到3这三个数,用右起第i个二进制位来代表数 i ,那么只有数字1的集合为:001==1,含有数字1,、2的集合为 011==3,空集为000==0;
3、状态压缩,比如:状压dp、hash;这个就不举例了,具体的可以自己去百度学习状压dp。
补充一下:
原码:二进制中第一个数表示是正数还是负数 ,剩下的数表示所要表示的数的绝对值.
比如,0010=2, 1010=-2
反码:因为原码在计算机中不方便,引入了反码,反码就是负数在二进制中除了第一个数表示符号外,其他的数都依次取反,
比如127=01111111,而-127=10000000;
补码:虽然反码方便但是在计算中会错(正数和负数的计算),因为0000=0,1111=-0=0;有两个数表示同一个数,所以在计算中会少一,补码就是在负数的反码上加上一。
比如-5=11111010(反码),补码为-5=11111011。