详解移位运算符-二进制中1的个数

本文详细探讨了移位运算符在处理负数时的行为,包括左移和右移。对于左移,解释了负数左移如何保持其负值,以及在某些情况下可能变为正数。同时,讨论了右移时正负数的不同处理方式。此外,文章还介绍了计算二进制中1的个数的高效方法,指出通过整数减1并与原数位与可以有效计算1的个数,避免了不必要的循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,左移运算如果处理负数的时候是咋样的呢???会不会通过左移将一个负数


     变成正数???


2,左移右移的时候,它的位数有的限制吗???可以无限

 

     大吗???


3,详解二进制中的1的个数


左移:


1,左移运算符m>> n表示把m左移n位。左移n位的时候,最左边的n位将

 

   被丢弃,同时在最右边补上n0


程序1:


#include<iostream>
#include<stdio.h>
using namespace std;

int main()
{
        int a,c;
        unsigned int b,d;
        a= 5;
        b= 5;
        c= -5;
        d= -5;
        printf("a is :%d\n", a<<2);
        printf("b is :%d\n", b<<2);
        printf("\n c is :%d %d\n", c,c << 2);
        printf("d is :%d %d\n", d , d <<2);
        return 0;
}


运行结果:




可以看到:


1   int类型a= 5时,a左移两位后,变成了20

   

        0000….. 0000 0101,左移两位后,变成了0000….. 0001 0100 (20)


2   unsignedint类型b= 5b左移两位后,变成了20


        0000….. 0000 0101,左移两位后,变成了0000….. 0001 0100 (20)


        而这里,intunsignedint的区别在于范围不一样:

       

        int32位):-21474836482147483647


        unsignedint0– 4294967295


3  int类型c= -5时,c左移两位后,变成了20


       c的二进制表示为:1111….. 1111 1011,然后将其左移2位后,变


       成了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值