不用if语句,不用汇编,怎么使得两数之积总是小于等于255?

weiwuyuan 2012-10-11 10:34:27
我想使 a*b如果大于255,就让他等于255,
其中a和b都是整型

如果不用if语句,也不用汇编,怎么做到?
...全文
3555 59 打赏 收藏 转发到动态 举报
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
小测一波 2012-10-25
  • 打赏
  • 举报
回复
int m = (a*b)>255?255:a+b;
一个语句实现!简单!可读性好!
sjg20010414 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

C/C++ code

int fun(int a,int b){
int arr[]={255, a*b};
return arr[a*b<=255];
}
[/Quote]

是不是可以借鉴这个思路
但原题应该限定a、b的范围,如unsigned char
// NoIf.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

unsigned char fun(unsigned char a, unsigned char b){
int product = a*b;
int arr[]={product,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255};
int index = (product&0xff00) >> 8;
return (unsigned char)(arr[index]);
}
int _tmain(int argc, _TCHAR* argv[])
{
int a,b;
scanf("%d,%d", &a, &b);
printf("result = %d", fun(a,b));
return 0;
}
LXZ_2008 2012-10-25
  • 打赏
  • 举报
回复
//不用if语句,a*b都是整型,最高位是符号位,如果255减去a*b的结果小于0
//那么最高位为1,右移31位后,再只保留第一位,然后乘以255,如果a*b大于255,
//这个符号位为1,那么右移与0x01结果为1,不然就是0,然后再或上a*b则结果要不就是前8位是255,
//要不就是小于255,最后再来一个与0xff,这样当a*b大于255,结果就一定是255,小于255,则结果是a*b
//这个只是临时想的,没有优化,大家可以优化一下。^-^
int muti(int a,int b){
return (((((0xff-a*b)>>31)&0x01)*0xff)|(a*b))&0xff;
}
小测一波 2012-10-25
  • 打赏
  • 举报
回复
int m = (a*b)>255?255:a*b;
一个语句实现!简单!可读性好
Thirol 2012-10-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
C/C++ code

int fun(int a,int b){
int arr[]={255, a*b};
return arr[a*b<=255];
}
[/Quote]
耳目一新,厉害!
xhmx444 2012-10-23
  • 打赏
  • 举报
回复
原来可以不用条件分支语句写程序..
fuqu2518 2012-10-23
  • 打赏
  • 举报
回复
短路求值,简单好用。后面的各种代码学习了。
pupingpp 2012-10-22
  • 打赏
  • 举报
回复
各种大神,学习了
doc110 2012-10-22
  • 打赏
  • 举报
回复
这个很不错~~~
xokai 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
C/C++ code

int fun(int a,int b){
int arr[]={255, a*b};
return arr[a*b<=255];
}
[/Quote]
厉害!简单易懂!
fshq3 2012-10-20
  • 打赏
  • 举报
回复
c=a*b
c=((c&(~0xff))-1)&0xff | (c&0xff)
YFLK 2012-10-17
  • 打赏
  • 举报
回复
溢出操作后只取内存低位字节就行!
JCIphone 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

5L厉害。
[/Quote]

+++1
terrandom 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

C/C++ code
unsigned int a = 4, b = 253;
unsigned int c = a * b;
bool dummy = (c &0xffffff00) && (c = 255);
[/Quote]

这最后的赋值就TM就是利用编译器的丑陋特性,语法上就跟写 if(NULL == c)是为了防止误写成 if(c=NULL) 一样的丑陋!
nooning 2012-10-14
  • 打赏
  • 举报
回复
用 语言特性可以

unsigned c=a*b;
bool r=c&0xffffff00;

(v = r*255) || (v=(!r)*c);

展开就是
(v= 255*((a*b)&0xffffff00)) || (v=c* !(a*b&0xffffff00))
nooning 2012-10-14
  • 打赏
  • 举报
回复
不好意思,一激动写反了
应该是
(!((a*b)&0xffffff00))*(a*b) | (!!((a*b)&0xffffff00))*255

也就是
unsigned c=a*b;
bool r=c&0xffffff00; 有符号0x7fffff00

v = r*255 + (!r)*c;

纯作为学术,无实际意义
nooning 2012-10-14
  • 打赏
  • 举报
回复
好简单的题 (!!((a*b)&0xffffff00))*(a*b) | (!((a*b)&0xffffff00))*255

也就是
c=a*b;
(!!(c&0xffffff00))*c+ (!(c&0xffffff00))*255

最容易理解的就是
unsigned c=a*b;
bool r=c&0xffffff00; 有符号0x7fffff00

v = r*c + (!r)*c;

纯作为学术,无实际意义
鬼火儿 2012-10-14
  • 打赏
  • 举报
回复
厉害啊
Roy_1986 2012-10-12
  • 打赏
  • 举报
回复

手太快。。。

(((a * b) / 255) ^ 0) * 255 + (!((( a * b) / 255) ^ 0)) * ((a * b) % 255)
Roy_1986 2012-10-12
  • 打赏
  • 举报
回复
上面写错了。。。


(!(((a * b) / 255) ^ 0)) * 255 + ((( a * b) / 255) ^ 0) * ((a*b) % 255)
加载更多回复(38)

64,701

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧