C|位运算模拟算术运算及某些位置0、置1、取反

C|位运算模拟算术运算及某些位置0、置1、取反

编码文章call10242025-02-05 18:09:538A+A-

1 按位与置0、按位或置1,按位异或取反

#include <stdio.h>
void printBinary(unsigned a)
{
    printf("\n%10u %X ",a,a);
    for(int i=31;i>=0;i--)
    {
        if((i+1)%4 == 0)
            printf(" ");
        if((a>>i & 1) == 1)
            printf("1");
        else
            printf("0");
    }
}
void test()
{
    unsigned data = 0x12345678;  // 305419896 // dec
    // 0001 0010 0011 0100 0101 0110 0111 1000 // binary
    printBinary(data);
    printf(" 原数据\n");
    unsigned mask = 0xFFFF0000;
    printBinary(mask);
    printf(" 掩码\n");
    unsigned a = data & mask;
    printBinary(a);
    printf(" 按位与&,后16位置0\n");
    unsigned b = data | mask;
    printBinary(b);
    printf(" 按位或|,前16位置1\n");
    unsigned c = data ^ mask;
    printBinary(c);
    printf(" 按位异或^,前16位取反\n");
}
int main()
{
    test();
    getchar();
    return 0;
}
/*

 305419896 12345678  0001 0010 0011 0100 0101 0110 0111 1000 原数据

4294901760 FFFF0000  1111 1111 1111 1111 0000 0000 0000 0000 掩码

 305397760 12340000  0001 0010 0011 0100 0000 0000 0000 0000 按位与&,后16位置0

4294923896 FFFF5678  1111 1111 1111 1111 0101 0110 0111 1000 按位或|,前16位置1

3989526136 EDCB5678  1110 1101 1100 1011 0101 0110 0111 1000 按位异或^,前16位取反

*/

2 按位运算与算术运算

2.1 二进制无进位加法

按位异域

0

0

1

1

^

0

1

0

1


0

1

1

0

2.2 二进制加法的进位

按位与

0

0

1

1

&

0

1

0

1


0

0

0

1

2.3 整型乘除

2.3.1 整型与一个2的某次幂相乘

用移位实现乘除法运算

a=a<<3; // a=a*(2^3);

b=b>>3; // b=b/(2^3);

2.3.2 整型与一个非2的某次幂相乘

a = a<<3+a; // a=a*9→a=a*(a^3+1)

3 整型按位乘法

移位相加实现二进制乘法:

移位、相加:

10110011*1101 // 179*13

= 179<<0*1+179<<1*0+179<<2*1+179<<3*1

= 0000 0000 0000 0000 1001 0001 0111 //2327

4 整型按位除法

2进制完成除法运算就是移位相减,比如1011011除以1110(91/14)顺序如下:

被除数

1

0

1

1

0

1

1

除数左对齐

1

1

1

0



除数对齐到小于被除数的位置

被除数

1

0

1

1

0

1

1




1

1

1

0








1

0

0


余数


1

0

0

0

1

1


余数继续相除:

被除数

1

0

1

1

0

1

1

除数


1

1

1

0







1

0

0

余数


1

0

0

0

1

1

除数



1

1

1

0






1

1

0

余数





1

1

1

1011011 / 1110 = 110 + 111 // 91/14 = 6+7

1011011 = 1110 * 0000110 + 111 // 91 = 14 * 6 + 7

-End-

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4