d********e 发帖数: 132 | 1 请实现一个具有以下功能的函数,但不能使用任何形式条件判断、分支、跳转等类型的
语句或指令:
int sign(INT32 x) {
if (x > 0) return 1;
else if (x == 0) return 0;
else return -1;
} |
a****9 发帖数: 418 | 2 max(-1, min(1, x))
这样符合要求不
【在 d********e 的大作中提到】 : 请实现一个具有以下功能的函数,但不能使用任何形式条件判断、分支、跳转等类型的 : 语句或指令: : int sign(INT32 x) { : if (x > 0) return 1; : else if (x == 0) return 0; : else return -1; : }
|
X****r 发帖数: 3557 | 3 There must be better solutions, but the following should work:
int sign(INT32 x) {
UINT32 u = x;
u |= u >> 16;
u |= u >> 8;
u |= u >> 4;
u |= u >> 2;
u |= u >> 1;
return ((UINT32)x >> 31) * ~0 | u & 1;
}
【在 d********e 的大作中提到】 : 请实现一个具有以下功能的函数,但不能使用任何形式条件判断、分支、跳转等类型的 : 语句或指令: : int sign(INT32 x) { : if (x > 0) return 1; : else if (x == 0) return 0; : else return -1; : }
|
d****p 发帖数: 685 | 4 Basic idea is use sign bit to fill the first sizeof(int)-1 bits and use x^0
to fill the last bit. |
a****l 发帖数: 8211 | 5 当然不符合,这叫作弊.
【在 a****9 的大作中提到】 : max(-1, min(1, x)) : 这样符合要求不
|
d****p 发帖数: 685 | 6
~~~~~~~ 除了这个二分法,好像想不出其他方法来检测是否全零
【在 X****r 的大作中提到】 : There must be better solutions, but the following should work: : int sign(INT32 x) { : UINT32 u = x; : u |= u >> 16; : u |= u >> 8; : u |= u >> 4; : u |= u >> 2; : u |= u >> 1; : return ((UINT32)x >> 31) * ~0 | u & 1; : }
|
y***d 发帖数: 2330 | 7 做一个两位数 n,高位存放 x 是否是负数,低位存放 x-1 是否是负数,然后做一个数
组 r[]={1,0,-1,-1},r[n] 就是要得的返回值;大概这样可以?
【在 d****p 的大作中提到】 : : ~~~~~~~ 除了这个二分法,好像想不出其他方法来检测是否全零
|
d****p 发帖数: 685 | 8 Wow, pretty cool.
These ppl who can figure it out in interview are really niu.
【在 y***d 的大作中提到】 : 做一个两位数 n,高位存放 x 是否是负数,低位存放 x-1 是否是负数,然后做一个数 : 组 r[]={1,0,-1,-1},r[n] 就是要得的返回值;大概这样可以?
|
t****t 发帖数: 6806 | 9 (((~x) & (x-1))>>31)&1
(translate: x==0 iff (~x has 1 on sign bit) and (x-1 has 1 on sign bit))
显然这种事情我们做硬件的太有优势了.
【在 d****p 的大作中提到】 : Wow, pretty cool. : These ppl who can figure it out in interview are really niu.
|
t****t 发帖数: 6806 | 10 啊, 被你先说了.
【在 y***d 的大作中提到】 : 做一个两位数 n,高位存放 x 是否是负数,低位存放 x-1 是否是负数,然后做一个数 : 组 r[]={1,0,-1,-1},r[n] 就是要得的返回值;大概这样可以?
|
|
|
d****p 发帖数: 685 | 11 Right. idea->code needs real experience.
【在 t****t 的大作中提到】 : (((~x) & (x-1))>>31)&1 : (translate: x==0 iff (~x has 1 on sign bit) and (x-1 has 1 on sign bit)) : 显然这种事情我们做硬件的太有优势了.
|
a****d 发帖数: 114 | 12 最后一步可否简化成:
return x >> 31 | u & 1;
【在 X****r 的大作中提到】 : There must be better solutions, but the following should work: : int sign(INT32 x) { : UINT32 u = x; : u |= u >> 16; : u |= u >> 8; : u |= u >> 4; : u |= u >> 2; : u |= u >> 1; : return ((UINT32)x >> 31) * ~0 | u & 1; : }
|
t****t 发帖数: 6806 | 13 right shifting signed number is implementation-defined. xentar's version
ensured portability.
【在 a****d 的大作中提到】 : 最后一步可否简化成: : return x >> 31 | u & 1;
|
l******e 发帖数: 12192 | 14 这个是经典老题
【在 d****p 的大作中提到】 : Right. idea->code needs real experience.
|
a****d 发帖数: 114 | 15 Oh... 牛啊
【在 t****t 的大作中提到】 : right shifting signed number is implementation-defined. xentar's version : ensured portability.
|
f*******y 发帖数: 55 | 16 偶花了1个小时搞了个这样的 ((x>>31)||((0-x)>>31))*(2*(x>>31) + 1);
比我开始想象的要复杂多了。唉。。。各位有没有验证过其它的答案啊? |
y***d 发帖数: 2330 | 17 || 是逻辑操作
【在 f*******y 的大作中提到】 : 偶花了1个小时搞了个这样的 ((x>>31)||((0-x)>>31))*(2*(x>>31) + 1); : 比我开始想象的要复杂多了。唉。。。各位有没有验证过其它的答案啊?
|
g**e 发帖数: 6127 | 18 int[] a = {1,0,-1,-1};
int t = (x>>>31)<<1 + (x-1>>>31);
return a[t];
【在 f*******y 的大作中提到】 : 偶花了1个小时搞了个这样的 ((x>>31)||((0-x)>>31))*(2*(x>>31) + 1); : 比我开始想象的要复杂多了。唉。。。各位有没有验证过其它的答案啊?
|
f*******y 发帖数: 55 | 19 if x is int
{
max int return:1
min int return:13 //random
5 return:1
1 return:1
-5 return:-1
-1 return:-1
0 return:1
1 return:1
}
if x is unsigned int
{
max return:1
min return:-1
5 return:1
1 return:1
-5 return:-1
-1 return:-1
0 return:0
1 return:1
}
谢谢学习了。
【在 g**e 的大作中提到】 : int[] a = {1,0,-1,-1}; : int t = (x>>>31)<<1 + (x-1>>>31); : return a[t];
|
f*******y 发帖数: 55 | 20 好玩儿,我再来一个: ((x>>31) *2 -((0-x)>>31)) % 2;
凑足茴香豆的写法。 |
|
|
l******e 发帖数: 12192 | 21 没说不让逻辑操作呀
【在 y***d 的大作中提到】 : || 是逻辑操作
|
y***d 发帖数: 2330 | 22 这就有分支跳转了
【在 l******e 的大作中提到】 : 没说不让逻辑操作呀
|
l******e 发帖数: 12192 | 23 为啥有逻辑运算就有分支跳转?
【在 y***d 的大作中提到】 : 这就有分支跳转了
|
h****g 发帖数: 71 | 24 int sign(INT32 x) {
return (x > 0)-(x<0);
} |