C语言中的一些位运算及其按位取反的说明

(一)对位运算的基本说明:

                                                1.按位与&:两个全为1则结果为1,否则为0

                                                2.按位或 | :两位有一个结果为1的结果为1,否则为0

                                                3.按位异或:两位一个为0一个为1的结果为1,否则为0

                                                4.:按位取反~:如,~2=?~5=?(下面会说到如何计算)

(二)一些小知识

                                1.二进制的最高位是符号位:0代表正数1代表负数

                                2.正数的原,返,补都一样(三码合一)

                                3.负数的反码=它的原码符号不变其它取反

                                4.负数的补码=反码加1

                                5.0的反码补码都是0

                        ·       6。在计算机运算的时候都是以补码的形式来运算的(比较重要)

几种按位取反的例子:

(一)~2=?

看上面第(二)中第6点,此时我们先把2的补码写出来,由于2是正数所以原码与补码相同即:

00000000  00000000  00000000  00000010(四个字节一个字节八位)

取反就是将所有位取反

11111111  11111111  11111111  11111101

你将补码取完反后应该在转回原码才是结果,因为我们最终要原码

符号位为1所以是负数要转原码先转成反码,负数中 补码=反码+1,则反码=补码-1即:

反码为

11111111  11111111  11111111  11111100

则现在将反码变为原码就很简单了,除符号位全部取反

10000000  00000000  00000000  00000011

则最终结果为:-3

所以~2=-3

位运算符和移位运算符

(一)>>,<<算数右移和算数左移,规则:

>>算术右移:低位溢出,符号位不变并用符号位补溢出的高位

<<算数左移:符号位不变,低位补0

(二)举例:-1>>2

-1的原码

10000000  00000000  00000000  00000001

反码

11111111  11111111  11111111  11111110

补码

11111111  11111111  11111111  11111111

整体右移两位

11111111  11111111  11111111  11111111

反码(补码-1)

11111111  11111111  11111111  11111110

原码

10000000  00000000  0000000 00000001

答案为-1

因为负数的的原返补不一样,所以需要这样写,如果是正数

1<<2直接就是个1*2*2=4

1<<3:1*2*2*2=8

4>>1:4/2=2

 其实就是一个移位的问题

你可能感兴趣的:(c语言,开发语言)