1

编写一个程序,从键盘读取一个整数值到一个 int 类型的变量中,并使用一个位运算符(即不是 % 运算符!)来确定除以 8 时的正余数。

例如,29 = (3x8)+5 和 14 = (2x8)+2 除以 8 时分别具有正余数 5 和 2。

我试图搜索如何解决它。我所做的是将给定的示例数字分解为二进制。

29 => 101001
8  => 001000
5 =>  000101

我不知道我应该用 29 和 8 做什么操作才能得到二进制结果 5。

在搜索时,有些人说我们应该做(和操作 7 )

remainder = remainder & 7 ;

然后我尝试用 Value 本身来做到这一点

value = value & 7 ; 

这是我的代码之后......

#include <iostream>

using std::cout;
using std::endl;
using std::cin;

int main()
{
  int value = 0;
  int divisor = 8;
  int remainder = 0;

  cout << "Enter an integr and I'll divide it by 8 and give you the remainder!"
       <<endl;
  cin >> value;

  value = value & 7;
  remainder = value & divisor;
  cout << remainder;

  return 0;
}

当我使用值 29 时,它给了我结果 0。我不知道我写的是对还是错。

4

2 回答 2

3

只需&数字本身与 7。此外,29 = 0b11101。概括地说,除以一个数字时的余数2 ^ n是通过&使用(2 ^ n) - 1( ^== power of)找到的

modulo 16因此,用 15来获得余数,&以此类推。

于 2012-12-09T12:52:05.797 回答
2

因为 8 正好是2^3,所以任何数的模 8 余数由它的最后三个二进制数字组成,即它等于数字按位加 7:

unsigned rem8 = number & 7;

(7 是111二进制的,这就是原因。)

于 2012-12-09T12:53:58.357 回答