计算机中的位运算和数值乘除关系

本文探讨了计算机中位运算如何表示数值的乘除关系。位运算左移(<<)相当于乘以2的幂,如5左移1位等于10。位运算右移(>>)通常表示除法,但奇数位移会丢失最低位,如5右移1位等于2。通过C++代码示例,解释了位运算在数值计算中的应用。

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

计算机中的位运算和数值乘除关系

计算机中数据的存储方式,是以二进制的方式进行存储。位运算的左移和右移一般代表数的乘除,但不同的数据乘除方式所获得的结果,不尽相同。一般位移时,空的位置以0作为补充。

关于计算机中数据的存储方式在这里不做说明,这里只说明数据的换算关系:

  1. 位运算左移<< 属于乘法关系
    无论是奇数还是偶数,位运算左移时(<<),均代表当前数值乘以2的几次方,而这个几次方和移动的位数是相同的。简单举个例子,如果定义一个数5,那么在计算机中进行左移1位时,得到的数就是10,左移两位得到的数就是20,左移3位得到的数是40。
    大家有兴趣的就去算一下,假定a对应的二进制的位数不做限制,那么左移n位,最后得到的数值应该为a*(2的n次方),这里可以用位运算左移来进行数值的乘以2的运算

下面以一段非正式C++编程语言来进行相应演示
/*
定义一个字符类型的数字5,由于字符型变量在计算机中只占用1个字节,也就是8位,数字5对应的二进制为0b0000 0101
1)假如向左移动1位,则得到的二进制为0b0000 1010,换算成十进制的数字就是10
2)假如向左移动2位,则得到的二进制为0b0001 0100,换算成十进制的数字就是20
3)假如向左移动3位,则得到的二进制为0b0010 1000,换算成十进制的数字就是40
*/
char a{5};
a<<=1;//表示a进行向左移一位的位运算
std::cout<<a<<std::endl;
最后屏幕上打印出来的a的值是10

  1. 位运算右移>>
    相对于左移的位运算,位运算右移则一般表示对2的除法。但对奇、偶数的位移不尽相同。
    当右移的数值是偶数时,右移一位,则表示当前数字除以2,例如,数字是6(对应二进制110),向右位移一位时,得到的结果是3(对应二进制011)。

特别注意,当右移的数值是奇数时,右移一位,则最低位的数字一定会被舍去。例如数字是5(二进制101),右移1位,得到的数字却是2(010)。再举一个例子,数字63(二进制111111),右移一位得到31(011111),再右移一位得到15(001111),再右移一位得到7(000111)……

这里也以一段代码进行演示:
char a{5};
a>>=1;//表示a进行向左移一位的位运算
std::cout<<a<<std::endl;
最后屏幕上打印出来的a的值是2

看到这里可以得到结论是,无论是奇数还是偶数,进行右移时,得到的结果是这个数除以2的商(但奇数位移后的余数会被舍去)。假如要用位运算右移来代替除法运算时,需要考虑

a. 当前数字是偶数时,位移几位后,得到的商是奇数
b. 当前数字是奇数时,假如需要还原位移的数字时,需要低位进行补1运算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值