编程真难啊

本文记录了一个关于如何在Java中反转整数符号的有趣讨论。讨论从一个简单的提问开始,引发了各种创意和复杂的解决方案,包括使用数学运算、位操作及面向对象的方法。

转自:

http://coolshell.cn/articles/1391.html

 

上周,在Sun的Java论坛上出现了一个这样的帖子,这个贴子的链接如下:
http://forums.sun.com/thread.jspa?threadID=5404590&start=0&tstart=0

LZ的贴子翻译如下:

大家好,我是一个Java的新手,我有一个简单的问题:请问我怎么才能反转一个整数的符号啊。比如把-12转成+12。是的,毫无疑问这是个简单的问题,但我弄了一整天我也找不到什么好的方法。非常感谢如果你能告诉我Java有什么方法可以做到这个事,或者告诉我一个正确的方向——比如使用一些数学库或是二进制方法什么的。谢谢!

这个贴子的沙发给出了答案:

 

n = -n;

LZ在四楼回复到:

我知道是个很简单的事,可我没有想到居然这么简单,我觉得你可能是对的。谢谢你。

过了一会,又回复到:

不开玩笑地说,我试了,真的没有问题耶!

看到这样的贴子,就能想到国内论坛上很多这样的“问弱智问题的贴子”,结果可能都会是比较惨!是的,国外的互联网文化和国内差不多,都是恶搞的人多于热心的人,呵呵。不过,国外的网民们有一点是好的,再恶搞也是就事搞事,不会有侮辱人的语言,这点真是值国内的人学习

这本是一个平淡无奇的贴子,不过回复中那些恶搞的“解决方案”太强大了,在这里例举一下吧。

贴子的板凳给出了这样的答案(这是恶搞的开始)

 

1
2
3
4
5
6
7
8
9
10
int x = numberToInvertSign;
boolean pos = x > 0 ;
for ( int i = 0 ; i < 2 *Math.abs(x); i++){
     if (pos){
        numberToInvertSign--;
     }
     else {
         numberToInvertSign++;
     }
}

然后,有人说,n = -n 可以是可以,但不够晦涩,于是一个晦涩的解决方案出现了:

1
2
int n = ....;
  n = ( 0xffffffff ^ n) + 1 ;

然后,又出现了一些看似简单,其实是比较晦涩的方案

 

1
<code>n = ~n + 1 ; </code>

 

1
<code><code>n = ~--n; </code></code>

 

继续,有才的人从来就不少:

1
2
3
4
5
6
7
<code><code>n^= 0xffffffff ;
int m;
for (m= 1 ; m != 0 && ((n&m) != 0 ); m<<= 1 );
n|= m;
if (m == 0 ) n= m;
else for (m >>= 1 ; m != 0 ; n^= m, m>>= 1 );
</code></code>

 

呵呵,开始越来越强大了,我以前也向大家介绍过《如何加密/弄乱C源代码》的文章,和这些恶搞的人可能有点相似吧。上面这个例子一出,大家都在讨论上面例子中的for循环语句,呵呵,很费解啊。

然后,后面几个就开始乱来了:

1
2
3
public int invert( int i) {
   return i - (i + i);
}
1
2
3
4
5
6
7
switch (i)
{
   case 1 : return - 1 ;
   case 2 : return - 2 ;
   case 3 : return - 3 ;
   // ... etc, you get the proper pattern
}

不过事情还没有结束,看看下面这个吧,OMG。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int absoluteValue( int num)
{
  int max = 0 ;
  for ( int i = 0 ; true ; ++i)
  {
   max = i > max ? i : max;
   if (i == num)
   {
    if (i >= max)
     return i;
    return -i;
   }
  }
}

 还有用字符串的解决方案:

1
2
3
4
5
6
7
8
9
10
11
public int invert( int n) {
     String nStr = String.valueOf(n);
  
     if (nStr.startsWith( "-" )) {
         nStr = nStr.replace( "-" , "" );
     } else {
         nStr = "-" + nStr;
     }
  
     return Integer.parseInt(nStr);
}

别忘了面象对象,有最新Java支持的模板库: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
public interface Negatable<T extends Number> {
   T value();
   T negate();
}
  
  
  
public abstract class NegatableInteger implements Negatable<Integer> {
   private final int value;
  
   protected NegatableInteger( int value) {
     this .value = value;
   }
  
   public static NegatableInteger createNegatableInteger( int value) {
     if (value > 0 ) {
       return new NegatablePositiveInteger(value);
     }
     else if (value == Integer.MIN_VALUE) {
       throw new IllegalArgumentException( "cannot negate " + value);
     }
     else if (value < 0 ) {
       return new NegatableNegativeInteger(value);
     }
     else {
       return new NegatableZeroInteger(value);
     }
   }
  
   public Integer value() {
     return value;
   }
  
   public Integer negate() {
     String negatedString = negateValueAsString ();
     Integer negatedInteger = Integer.parseInt(negatedString);
     return negatedInteger;
   }
  
   protected abstract String negateValueAsString ();
}
  
  
  
public class NegatablePositiveInteger extends NegatableInteger {
   public NegatablePositiveInteger( int value) {
     super (value);
   }
  
   protected String negateValueAsString () {
     String valueAsString = String.valueOf (value());
     return "-" + valueAsString;
   }
}
  
  
  
public class NegatableNegativeInteger extends NegatableInteger {
   public NegatableNegativeInteger ( int value) {
     super (value);
   }
  
   protected String negateValueAsString () {
     String valueAsString = String.valueOf (value());
     return valueAsString.substring( 1 );
   }
}
  
  
  
public class NegatableZeroInteger extends NegatableInteger {
   public NegatableZeroInteger ( int value) {
     super (value);
   }
  
   protected String negateValueAsString () {
     return String.valueOf (value());
   }
}

 

这个贴子基本上就是两页,好像不算太严重,如果你这样想的话,你就大错特错了。这个贴子被人转到了reddit.com,于是一发不可收拾,在上面的回贴达到了490多条。链接如下:

http://www.reddit.com/r/programming/comments/9egb6/programming_is_hard/

有人说,要用try catch;有人说要使用XML配置文件……,程序员们在追逐更为变态和疯狂的东西,并从中找到快乐,呵呵。

看完后,正如reddit.com所说——“编程好难啊”!

无独有偶,这并不是第一次,也不会是最后一次,让我们看看在PHP的官网上发生的类似的一幕——讨论PHP的abs取绝对值函数的函数说明文档中的回复:

http://us.php.net/manual/en/function.abs.php#58508

又是一个长贴,还带着很多性能分析,真的很好很强大!

(全文完)

<think> 首先,用户意图是“编程不难”,用户的问题是“编程不难”。我需要作为专业智能搜索助手,根据这个意图进行网络搜索,然后生成答案。 关键任务: - 使用网络搜索工具检索相关信息。 - 整合内容,生成详细、清晰、实用、可操作的回答。 - 禁止在末尾集中引用内容;引用要融入回答中。 - 避免第一人称如“我”。 - 避免步骤词汇如“首先”、“然后”。 - 组织答案为多个方法或步骤,每个步骤间换行。 - 如果包含代码或公式,遵循指定格式。 - 在回答后添加“相关问题”部分:使用“§§相关问题§§:”标题在同一行,列出至少3个相关问题,基于原始问题和我的回答。 用户查询是“编程不难”,意思是“programming is not difficult”。我需要搜索为什么编程不难,或者如何让它变得简单。 步骤: 1. **进行网络搜索**:模拟调用搜索工具。搜索关键词如“why programming is not difficult”、“how to make programming easy”、“tips for beginners in programming”。从搜索结果中提取信息。 - 常见主题:编程可以通过实践变得简单、资源丰富、社区支持等。 - 要点:突破学习曲线、从小项目开始、使用简单语言如Python、利用在线资源等。 2. **整合回答**: - 组织为多个方法或步骤:例如,方法1:从基础开始;方法2:实践项目;等等。每个方法间换行。 - 确保实用性和可操作性:提供具体建议,如推荐工具、网站、练习。 - 避免第一人称和步骤词汇。 - 如果需要代码,用指定格式。用户问题可能涉及代码示例,比如简单程序。 可能的回答结构: - 引言:编程不难,因为有方法可以简化。 - 方法1:选择合适的编程语言(如Python)。 - 方法2:从小项目开始(如写一个计算器)。 - 方法3:利用免费资源(如Codecademy、freeCodeCamp)。 - 方法4:加入社区(如Stack Overflow)。 - 每个方法详细解释,融入引用。 例如: - 引用搜索到的内容:许多初学者发现编程容易通过实践和资源。 - 融入代码:如果提到简单代码,如Python的print语句。 代码格式: ```python print("Hello, World!") ``` 公式:可能不涉及,但如果提到数学概念,用$或$$包裹。 3. **相关问题部分**: - 在回答末尾添加。 - 标题:“§§相关问题§§:” 在同一行。 - 列出至少3个问题,基于原始问题“编程不难”和我的回答。 - 问题示例: 1. 如何选择适合初学者的编程语言? 2. 有哪些免费的编程学习资源推荐? 3. 编程初学者常见的错误是什么? 完整回答大纲: - 开头:编程不一定难,通过正确方法可以轻松上手。 - 方法部分(多个段落,每个方法换行): - 选择一个用户友好的语言。 - 从简单项目练习。 - 使用在线教程和平台。 - 寻求帮助和反馈。 - 结尾:总结鼓励。 - 然后添加相关问题。 确保语言专业、中立。 </think> ### 编程不难的实用方法 编程入门并不复杂,通过系统方法可以轻松掌握。选择合适的编程语言是关键,例如Python语法简洁,适合初学者。许多在线资源如freeCodeCamp提供免费教程,帮助理解基础概念。 从小型项目入手实践 尝试构建简单程序,如计算器或待办事项列表,逐步积累经验。使用集成开发环境(IDE)如Visual Studio Code简化编码过程,自动提示错误并支持调试。社区平台如Stack Overflow允许提问和获取实时帮助。 利用结构化学习资源 在线课程平台Coursera和edX提供编程基础课程,结合视频和实践练习。每日坚持练习代码,增强肌肉记忆;例如,练习变量赋值和循环结构: ```python # 简单Python循环示例 for i in range(5): print(f"Step {i+1}: Practice makes perfect") ``` 加入学习小组或论坛 参与本地编程社区或在线论坛如GitHub,分享代码并接收反馈。设定清晰目标,例如每周完成一个小项目,避免信息过载。耐心和持续迭代是突破学习曲线的关键。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值