70,020
社区成员




if (num < 0 && *rem > 0) {
(*quot)++;
*rem -= denom;
}
/**
* @file div2.c
* @brief
*/
#include <stdio.h>
int div2(int num, int bit, int *quot, int *rem)
{
unsigned int mask;
unsigned int denom;
denom = 1 << bit;
mask = denom - 1;
*quot = num >> bit;
*rem = num & mask;
if (num < 0 && *rem > 0) {
(*quot)++;
*rem -= denom;
}
return *quot;
}
int main(void)
{
int num, bit, quot, rem;
num = 5, bit = 1;
div2(num, bit, ", &rem);
printf("%d/%d = %d+%d/%d\n", num, 1 << bit, quot, rem, 1 << bit);
num = -5, bit = 1;
div2(num, bit, ", &rem);
printf("%d/%d = %d+%d/%d\n", num, 1 << bit, quot, rem, 1 << bit);
return 0;
}
/**
* @file div2.c
* @brief
*/
#include <stdio.h>
int div2(int num, int bit, int *quot, int *rem)
{
int mask;
mask = (1 << bit) - 1;
*quot = num >> bit;
*rem = num & mask;
return *quot;
}
int main(void)
{
int num, bit, quot, rem;
num = 15, bit = 2;
div2(num, bit, ", &rem);
printf("%d/%d = %d+%d/%d\n", num, 1 << bit, quot, rem, 1 << bit);
num = -15, bit = 2;
div2(num, bit, ", &rem);
printf("%d/%d = %d+%d/%d\n", num, 1 << bit, quot, rem, 1 << bit);
return 0;
}
#include <stdio.h>
/* 定义个类型,主要是为了方便返回商和余数 */
struct DIV_T
{
/* 商 */
int quot;
/* 余数 */
int rem;
};
/*
有符号数除法,负数的时候要加上一个偏置量即
x / (2^k) = (x < 0 ? (x + (1 << k) - 1) : x) >> k
这样的话就会向0取整,比如-5 / 2 = -2.5 = -2
*/
struct DIV_T xDiv(int a, int b)
{
/* 符号位,这是一个常数,在编译时候就能计算出来 */
enum {SIGN_BIT = 1 << ((sizeof(int) << 3) - 1)};
/* 是否为负数 */
int neg = a & SIGN_BIT;
/* 偏置量,负数的话要加上偏置量 */
int bias = ((1 - !neg) << b) - (1 && neg);
struct DIV_T tmp;
tmp.quot = (a + bias) >> b;
tmp.rem = a - (tmp.quot << b);
return tmp;
}
int main(int argc, char **argv)
{
int a = -285, b = 3;
struct DIV_T result = xDiv(a, b);
printf("a = %d, b = %d, 2^b = %d\nquot = %d, rem = %d\n", a, b, (1 << b), result.quot, result.rem);
return 0;
}
#include <stdio.h>
#define MOVE_BIT (sizeof(int) * 8 - 1) // 32bit is 31, 16bit is 15
#define TIVE_V(a) (a) = (~(a) + 1)
// Remainder
// Divisor
void GetDivRmd(int nVar, int nBit, int *pnDiv, int *pnRmd)
{
int nPos = ((nVar >> MOVE_BIT) & 0x1); // Positive number or Negative number
int nCount = 0;
while (nBit > 1)
{
// get 2 bit number
nCount++;
nBit >>= 1;
}
if (nPos) // Negative number
{
TIVE_V(nVar); // get abs var, is Positive number
}
*pnDiv = nVar >> (nCount);
*pnRmd = nVar - (*pnDiv << nCount);
if (nPos)
{
TIVE_V(*pnDiv); // set Negative number
TIVE_V(*pnRmd); // set Negative number
}
}
int main(void)
{
int nDiv;
int nRmd;
GetDivRmd(285, 8, &nDiv, &nRmd);
printf("285/8 = %d(%d)\n", nDiv, nRmd);
GetDivRmd(-285, 8, &nDiv, &nRmd);
printf("-285/8 = %d(%d)\n", nDiv, nRmd);
return 0;
}
#include<stdio.h>
int main(){
unsigned a,b;
while(scanf("%u %u", &a,&b)){//b是输出的2的指数,输入3意思是8
printf("quot==%u\n", a>>b);
printf("rem==%u\n", a&b);
}
}
#include<stdio.h>
int main(){
unsigned a,b;
while(scanf("%u %u", &a,&b)){//b是输出的2的指数,输入3意思是8
printf("%u/%u quot==%u\n",a, 1<<b, a>>b);
printf("rem==%u\n", a&((1<<b)-1));
}
}
#include<stdio.h>
#include<stdlib.h>
int main(){
int a,b;
while(scanf("%d %d", &a,&b)){//b是指数,输入3意思是8
printf("%d/%d quot==%d\n",a, 1<<b, div(a,1<<b).quot);
printf("rem==%d\n", div(a,1<<b).rem);
}
}