位(bit)运算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位(bit)运算相关的知识,希望对你有一定的参考价值。

参考技术A

一、二进制:所谓二进制就是逢二进一 (0,1), 因为使用二进制只有 0, 1 两个数,简单,易于电子方式实现 , 同时,通过0,1 组合可以表示任意一个数.
二进制有三个重要的概念:

1.原码
用二进制来表示一个数,这个码就是原码.

1 ------> 原码 00000000 0000000 0000000 00000101 = 1 2的零次方+0 2的一次方+1* 2的二次方=1+0+4=5

2.负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)

反码(正数的反码和它的原码一样 , 负数反码 是 符号位不变其它位取反)
补码(正数的补码和它的原码一样,负数的补码是 它的反码+1)
举例

-1
-1的原码 10000000 00000000 00000000 00000001
-1的反码 11111111 11111111 11111111 11111110
-1 的补码 11111111 11111111 111111111 11111111

3. 在计算机运算的时候,都是以补码的方式来运算的

4+5=>计算机 4-5=4+(-5)

这句话意思就是,不管一个数是正数还是负数,都要被转成补码,然后进行运算.
位运算一览表:

该图的前面四个是位运算
其运算规则是:
按位与& : 两位全为1,结果为1
按位或| : 两位有一个为1,结果为1
按位异或 ^ : 两位一个为0,一个为1,结果为1
按位取反 : 0->1 ,1->0
<h3>求解:~2=?</h3>

步骤 : 首先要求出 2的补码

2是正数 所以 原码=反码=补码

2 原码

00000000 00000000 00000000 00000010

~2

11111111 11111111 11111111 11111101 (补码)->原码

? 负数的 原码-》反码-》补码
11111111 11111111 11111111 11111101->

推出其反码 (对补码-1)

11111111 11111111 11111111 11111100

推出原码

10000000 00000000 00000000 0000011 -> -3

~-5=?

-5 的 补码找出来.
-5 原码 10000000 00000000 00000000 00000101
-5 反码 11111111 11111111 11111111 11111010
-5 补码 11111111 11111111 11111111 11111011

~-5取反 00000000 00000000 00000000 00000100 (补码)

4

3 的补码 00000000 00000000 00000000 00000011
2&3 00000000 00000000 00000000 00000010 [补码]

2 的补码 00000000 00000000 00000000 00000010
3 的补码 00000000 00000000 00000000 00000011
2^3 00000000 00000000 00000000 00000001

二:位移运算:在php 中位运算有两种 >> (右移) << (左移)

运算的规则是 :
算术右移:低位溢出,符号位不变,并用符号位补溢出的高位
算术左移: 符号位不变,低位补0

根据我们前面的规范,来完成几个案例

$a=1>>2;

1 的补码

00000000 00000000 00000000 00000001

1>>2

00000000 00000000 00000000 00000000
$b=-1>>2;

$c=1<<2;

1<<2
1的补码
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000100

c语言中按位逻辑运算符位移运算符

c语言中按位逻辑运算符、位移运算符

#include <stdio.h>

int count_bits(unsigned x)
{
    int bits = 0;
    while(x)
    {
        if(x & 1U)
            bits++;
        x >>= 1;
    }
    return bits;
}

int int_bits(void)
{
    return count_bits(~0U);
}

int print_bits(unsigned x)
{
    int i;
    for(i = int_bits() - 1; i >= 0; i--)
    {
        putchar(((x >> i) & 1U) ? \'1\' : \'0\');
    }
    putchar(\'\\n\');
}

int main(void)
{
    unsigned a, b;
    puts("please input two unsigned integers.");
    printf("unsigned a = "); scanf("%u", &a);
    printf("move unit  = "); scanf("%u", &b);
    
    printf("\\nbinary a    = "); print_bits(a);
    printf("right move  = "); print_bits(a >> b);
    printf("left move   = "); print_bits(a << b);
    return 0;
}

 

以上是关于位(bit)运算的主要内容,如果未能解决你的问题,请参考以下文章

Python 模拟32bit 浮点数运算

C语言位运算的应用如何按bit位翻转一个无符号整型

位(bit)运算

c语言中按位逻辑运算符位移运算符

c语言中按位逻辑运算符位移运算符

C言语位运算