按位与、按位或操作结果

2020年3月1日 4619点热度 1人点赞 1条评论
内容纲要

二进制数,
任何数与 N 个 1 进行按位与,结果等于自身;或者与 N 个 0 进行按位或,结果等于自身。
任何数与 N 个 0 进行按位与,结果是 N 个 0;任何数与 N 个 1 进行按位或,结果是 N 个 1;

与 N 个 1 按位与。
1 0 1 0 1 1 0 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 0 1 0 1 1 0 1 1 1 1

可以通过此特性来获取某几位上的数。

获取某几位上的数字

例如获取一个 int 类型 8-11 位的数据。
C#版

            int num, mark;          
            Console.WriteLine("输入一个整数(大于256)");
            num = Convert.ToInt32(Console.ReadLine());
            num = num >> 8;
            mark = ~(~0 << 4);    // 构造 00000000 00000000 00000000 00001111
            // mark = 0b00000000_00000000_00000000_00001111;
            num = num & mark;
            Console.WriteLine(num);
            Console.ReadKey();

C 语言

#include <stdio.h>
int main()
{
    printf( "输入数字(256以上)" );
    int num;
    int mark;
    scanf( "%d", &num );
    num = num >> 8; /* 移动8位,使8-11变成0-4位 */
    mark    = num & ~(0 << 4);
    printf( "result = 0x%x", mark );
    return(0);
}

输出一个数的二进制

原理是,0或1 跟 1 的按位与,等于自身,跟 0 的按位与等于 0 。
任意输入一个正整数,输出这个数的二进制。
C语言版本

#include <stdio.h>
int main()
{
    printf( "输入数字(256以上)" );
    int num;
    int mark;
    printf( "%d", '1' );
    scanf( "%d", &num );
    mark = 1 << 31;

    int i = 0;
    for ( i = 0; i <= 31; i++ )
    {
        printf( "%c", num & mark ? '1' : '0' ); /* 结果要么大于0,要么等于0 */
        /* putchar( num & mark ? '1' : '0' ); / * 强制转化为8位变量(低八位) * / */
        num = num << 1;
        if ( (i + 1) % 8 == 0 )
            putchar( ',' );
    }
    putwchar( 'B' );
    return(0);
}

C# 版本

            uint num;
            int mark;
            Console.WriteLine("输入一个整数(大于256)");
            num = Convert.ToUInt32(Console.ReadLine());
            mark = 1 << 31;
            string str = string.Empty;

            for (int i = 0; i < 31; i++)
            {
                Console.Write((num & mark) == 0 ? '0' : '1'); // 每一步的结果,首位要么为1,要么为0,
                                                              // 结果要么大于0,要么等于0
                num = num << 1;
                if ((i + 1) % 8 == 0)
                    Console.Write(',');
            }
            Console.Write("B");
            Console.ReadKey();

痴者工良

高级程序员劝退师

文章评论