标签:
本人由于刚接触编程不久,思考的问题没有大家的那么深入。这次我仅仅只是一点基于学习的思考。今天在家里复习学校学过的功课,关于运算操作符的那一章节。 编写一个程序:从界面输入一个整数,要求求该数除以8后的余数。这个题目确实很简单,只要用%运算即可。但是我写出代码后发现编译器对于负数求模运算后所得的余数是负数。当然大家很容易想到此时加上除数即可达到题目的要求。我想这个代码大都会写,我就不再细述,但是今天我想输得方法并不是此。一个整型(int)占4个字节,每个字节8位。那么每个int占32个位。如果我们把该整数化成8进制,那么其8进制表示的数的个位数就是所求的余数。因为如果一个8进制数是xyz,那么其等于x*8*8+y*8+z;除以8取余就是z;那么我们再联想到计算机的存储数据的方式,二进制。而二进制转化成8进制的最简单的方法则是将该二进制从右至左按每三个数为一单元转化为8进制作为一位。不够的补0;那么由此可知,其正余数就是该数二进制表示的末尾3位数。 那么只要用与运算去保留后三位。即该数与上二进制(111)即可,而从界面输入的是10进制,则要考虑转化,很容易知道其为7。故设输入的数位num,则num&7所得结果即是。
而对于2的n次方作为除数是则只要num&(2的n次方-1)
#include<iostream> using namespace std; int main() { int num;//输入的整数 int i;//由于考虑除数不同,在此自己设置除数2的n次方 cout<<"请输入一个整数:"; cin>>num; cout<<"请输入除数:"; cin>>i; num=num&(i-1); cout<<num<<endl; return 0; }
标签:
原文地址:http://www.cnblogs.com/icew4y/p/4273796.html