Pepsi Refresh Project
發表: 2012 年 08 月 26 日 Filed under: Marketing - VinsonHsieh, Vinson's Talks 發表留言
在海外建立有效率的研發能力
發表: 2012 年 08 月 26 日 Filed under: 管理評論 - 作者: VinsonHsieh 發表留言- 新穎且複雜的經營挑戰,它意謂著要將研發策略與公司最高營運策略連接起來
- 研發中心的主要目標是否在於,擴增原本母公司必須提供給國外使用的知識,建立取得新知識的管道,以及吸收國外大學和競爭者新的研究成果到自己的組織內
- 在全世界競爭的公司必須以愈來愈快的速度,把新產品從研發推上市場
- 成立科技導向的委員會
- 成員都是擁有技術專業和深入的組織知識的高階經理人
- 對新的研發據點作分類
- 「強化母公司基地的研發據點」資訊是由外國實驗室流向母國的中心實驗室
- 「利用母公司基地的研發據點」資訊是由母國的中心實驗室流向國外實驗室
- 選擇研發據點的位置
- 矽谷的知識圈誇稱,圈內專家非正式聚會次數如過江之鯽,而且高科技公司與鄰近大學,尚有更正式的交換資訊的方式,例如與史丹福大學、加州大學柏克萊分校的產業連繫計畫
- 以往工業化國家的公司在海外設立製造廠,主要是從低廉的工資獲利,或為了避免貿易壁壘。但隨著時間發展,當許多工廠已經從事日益複雜的製造任務,就需要在其附近設立研發機構,以便把研究所得的技術迅速轉移到製造之上
Inside Chrome – Part 1
發表: 2012 年 08 月 25 日 Filed under: 程式面面觀 - 作者: VinsonHsieh, Vinson's Talks 發表留言[Part 1]
[Part 2]
大数相乘
發表: 2012 年 08 月 15 日 Filed under: Uncategorized 發表留言http://blog.csdn.net/hzgdiyer/article/details/6114420
我们知道计算机数据类型有int, long, char, float,double等等,还有指针是用来在内存中寻址的,在32bits系统中,指针是4个bytes(32 bit),即2的32次方等于4G,即32位的系统支持内存最大是4G,而我们目前的硬件CPU和操作系统(Win 7)支持64位寻址,也就是说指针占有8个bytes,大家想想2的64次方是多大。系统所支持的内存比4G大了很多很多很多倍,大家计算机系学习算法都知道用空间换时间,这下我们的内存足够大了,可以一下将所有的数据放入内存,提高运算效率。
64位的操作系统,C语言数据类型所占用最大8bytes(long), 范围[-2^32, 2^32-1], 最大值是: 9,223,372,036,854,775,807, 那么如果2^32乘以2^32,结果怎么样呢?如下:
Long la = 9,223,372,036,854,775,807;
Long lb = 9,223,372,036,854,775,807;
Long lresult = la * lb;
我们可以看到la * lb 结果肯定大于 2^32,我们用来存储计算结果的lresult 所占内存空间是8bytes, 根本放不下这个值,所以结算结果就会溢出。
我们可以用字符串来存储数据(任意长度的数据),即如果一个数据长度为100000,我们可以动态申请100000+1个长度char内存,即 char *p = new char[100001];
如下代码思路如下,我们运算的数据可以是正数(1111111),负数(-1111),也能是浮点数(-1.2222), 正数负数计算符号好说:2个运算数的符号相异或(XOR), 如果为1,计算结果就为负数。至于小数点,我们上小学时就学过了2个数相乘(1.11 * 2.22 ),步骤如下:
1. 先剔除小数点,再计算2数相乘,(111 * 222 = 24642)
2. 2个运算数的小数点位(倒数)相加 (2 + 2 = 4, 即1.11小数点位置2, 2,22小数点位置为2)
3. 相乘结果(24642) 倒数插入小数点位数之和(4)得到预算结果: 2.4642
整体思路如下:
1. 对输入的数据(字符串)提取 数字 + 符号 + 小数点位数,对应函数:
char *extract_string(char *sour, e_sign_type &sign, unsigned int &ndot)
2. 对提取出的 数字相乘,计算出结果;
char *mult_pos_int(char *mult1, char *mult2)
3. 对相乘结果,补上 符号 和 小数点位数
char *recover_string(char *sour, e_sign_type sign, unsigned int ndot)
最后提供计算接口函数是:
char *mult_signed_num(char *mult1, char *mult2)
//代码如下,编译环境Visual c++ 2005,系统: windows Xp
#include “stdafx.h"
#include <string.h>
#include <iostream>
using namespace std;
enum e_sign_type
{
ENUM_POSITIVE, // 正数
ENUM_NEGATIVE, // 负数
};
/*————————————————————————————–
Function: 2个字符串相乘
Parameter: mult1: 乘数,mult2: 乘数
Return: 两数相乘的结果
Condition: 1. 这里假设这个数都是正整数,即不考虑小数点和负号
2. 返回值的内存在这个函数里动态分配,注意在外部释放内存
——————————————————————————————*/
char *mult_pos_int(char *mult1, char *mult2)
{
if ( (NULL==mult1) && (NULL==mult2) )
return NULL;
unsigned int nlen1 = strlen(mult1);
unsigned int nlen2 = strlen(mult2);
// 本程序局限性:计算结果长度为:^32 = 4294967296,如果计算结果长度超过亿,将会溢出。
// 不妨将类型修改为长度为bytes类型long long
// 另外:nlen1+nlen2也可能溢出
unsigned int nlen_r = nlen1+nlen2; // 即数相乘的结果长度最大是乘数长度之和
char *sz_res = new char[nlen_r+1]; // 最后还有一结束符
if (NULL == sz_res)
{
cout << “new memory fail" << endl;
return NULL;
}
memset(sz_res, 0, nlen_r+1);
char *end1 = mult1+nlen1-1;
char *end2 = mult2+nlen2-1;
char *end_r= sz_res+nlen_r-1;
char *tok = end_r;
int carry = 0; // 进位
while(mult1 <= end1)
{
carry = 0; // 进位
while (mult2 <= end2)
{
int tmp = (*end1-0x30) * (*end2-0x30) + carry + *end_r;
*end_r = tmp%10;
carry = tmp/10;
end_r–;
end2–;
}
*end_r = carry; // high attention
end1–;
end2 = mult2+nlen2-1;
tok–;
end_r= tok; // 每次运算完成后end_r后移一位
}
if (carry > 0)
{
*sz_res = carry; // 最高位为carry
char *pcur = sz_res;
for (unsigned int i=0; i<nlen_r; i++) // high attention
{
*pcur += 0x30;
pcur++;
}
return sz_res;
}
else // 最高位为,需要移位
{
// 考虑到如果计算结果特别长,比如是sizeof(unsigned int),依次移位特别慢,
// 是否可以另外申请一块内存,用memcpy复制过去,代码如下:
char *sz_new = new char[nlen_r]; // 长度为nlen_r即可
memcpy(sz_new, sz_res+1, nlen_r);
delete []sz_res;
sz_res = NULL;
char *pcur = sz_new;
for (unsigned int i=0; i<nlen_r-1; i++) // high attention: i<nlen_r-1
{
*pcur += 0x30;
pcur++;
}
return sz_new;
}
}
/*————————————————————————————–
Function: 判断输入的字符串是否是浮点数
Parameter: sz: input, s输入的字符串
Return: 0: 不是浮点数
其它值: 浮点数小数点所在字串的位置
Condition: sz不为空
——————————————————————————————*/
int check_floating(char *sz)
{
int npos = 0;
char *end = sz + strlen(sz) – 1;
while(sz < end)
{
if (‘.’ == *end)
return npos;
else
end–;
npos++;
}
return 0;
}
/*————————————————————————————–
Function: 从输入的字符串中提取数字信息,即剔除’-‘和’.’
Parameter: sour: 输入的字符串
sign: 传出的值,枚举
ndot: 传出的值, 0: 不是浮点数 其它值:小数点所在字符串的位置索引
Return: 剔除’-‘和’.’后的字符串
Notes: 返回的字符串内存是在这个函数内部分配的,需要在函数外部进行内存释放
——————————————————————————————*/
char *extract_string(char *sour, e_sign_type &sign, unsigned int &ndot)
{
// 是否是负数的标示
if (‘-‘ == *sour)
sign = ENUM_NEGATIVE;
else
sign = ENUM_POSITIVE;
// 乘数是否是浮点数的标志,ndot是小数点的位数
ndot = check_floating(sour);
unsigned int nlen = strlen(sour);
if (ENUM_NEGATIVE == sign) // 判断是否有负号
nlen–;
if (ndot > 0) // 判断是否是浮点数
nlen–;
// new memory
char *sz_ret = new char[nlen+1];
memset(sz_ret, 0, nlen+1);
char *cur = sz_ret;
if (0 == ndot)
{
// 如果是负数,则’-‘号跳过
if (ENUM_NEGATIVE == sign)
sour++;
while (0 != *sour)
*cur++ = *sour++;
}
else
{
char *sz_inp = sour;
if (ENUM_NEGATIVE == sign)
sz_inp++;
while (0 != *sz_inp)
{
if (‘.’ != *sz_inp)
*cur++ = *sz_inp++;
else
sz_inp++;
}
}
return sz_ret;
}
/*————————————————————————————–
Function: 给输入的字符串添加字符’-‘和’.’
Parameter: sour: 输入的字符串
sign: 传入的值,枚举
ndot: 传入的值, 0: 不是浮点数 其它值:小数点所在字符串的位置索引
Return: 添加’-‘和’.’后的字符串
Notes: 返回的字符串内存是在这个函数内部分配的,需要在函数外部进行内存释放
——————————————————————————————*/
char *recover_string(char *sour, e_sign_type sign, unsigned int ndot)
{
int nlen = strlen(sour);
if (ENUM_POSITIVE == sign)
nlen++; //如果是负数的话,长度加一,for ‘-‘
if (ndot > 0)
nlen++; //如果浮点数的话,长度加一,for ‘.’
char *sz_ret = new char[nlen+1];
memset(sz_ret, 0, nlen+1);
// 特殊情况: sour等于
if (0 == atoi(sour))
{
*sz_ret = 0x30;
return sz_ret;
}
else
{
char *ret_cur = sz_ret;
if (ENUM_NEGATIVE == sign)
{
*ret_cur = ‘-‘;
ret_cur++;
}
// 考虑小数点左边的整数
int nlen_int = strlen(sour)-ndot; // 整数长度
char *sz_int = new char[nlen_int+1];
memset(sz_int, 0, nlen_int+1);
memcpy(sz_int, sour, nlen_int);
if (0 == atoi(sz_int)) // 整数部分全部为
{
*ret_cur = 0x30;
ret_cur++;
}
else
{
int num = 0; // 即无用的个数,比如: 00011,即num = 3
char *cur = sz_int;
while(cur < sz_int+nlen_int)
{
if (0x30 == *cur)
{
cur++;
num++;
}
else
break;
}
memcpy(ret_cur, sour+num, nlen_int-num);
ret_cur += (nlen_int-num);
}
delete []sz_int;
sz_int = NULL;
// 考虑小数部分, ndot即为小数部分的长度
if (ndot > 0)
{
char *pdeci = sour+strlen(sour)-ndot;
if (0 == atoi(pdeci))
{//do nothing
}
else
{
// 处理小数点
*ret_cur = ‘.’;
ret_cur++;
int num = 0; // 小数位无效的个数,比如:.11000,即num为
char *end = sour+strlen(sour)-1;
while (pdeci < end)
{
if (0x30 == *end)
{
end–;
num++;
}
else
break;
}
memcpy(ret_cur, pdeci, ndot-num);
}
}
}
return sz_ret;
}
/*————————————————————————————–
Function: 2个字符串相乘
Parameter: mult1: 乘数,mult2: 乘数
Return: 两数相乘的结果
Condition: 1. 这个数可以是有符号的,也可以是浮点数
2. 返回值的内存在这个函数里动态分配,注意在外部释放内存
——————————————————————————————*/
char *mult_signed_num(char *mult1, char *mult2)
{
if ((NULL==mult1) && (NULL==mult2))
return NULL;
e_sign_type sign1 = ENUM_POSITIVE; // 乘数是否是负数的标示
e_sign_type sign2 = ENUM_POSITIVE;
unsigned int ndot1 = 0; // 乘数是否是浮点数的标志,ndot是小数点的位数
unsigned int ndot2 = 0;
char *sz_para1 = extract_string(mult1, sign1, ndot1);
char *sz_para2 = extract_string(mult2, sign2, ndot2);
char *sz_res = mult_pos_int(sz_para1, sz_para2);
if (NULL != sz_para1)
{
delete []sz_para1;
sz_para1 = NULL;
}
if (NULL != sz_para2)
{
delete []sz_para2;
sz_para2 = NULL;
}
char *sz_val = recover_string( sz_res,
(sign1==sign2) ? ENUM_POSITIVE : ENUM_NEGATIVE,
ndot1+ndot2);
if (NULL != sz_res)
{
delete []sz_res;
sz_res = NULL;
}
return sz_val;
}
int _tmain(int argc, _TCHAR* argv[])
{
char sz1[256] = {0};
cout << “pls enter num1″ << endl;
cin >> sz1;
char sz2[256] = {0};
cout << “pls enter num2″ << endl;
cin >> sz2;
char *sz_res = mult_signed_num(sz1, sz2);
cout << “num1 * num2 = " << endl;
cout << sz_res << endl;
if (NULL != sz_res)
{
delete sz_res;
sz_res = NULL;
}
return 0;
}
報酬遞增與新的商業世界
發表: 2012 年 08 月 14 日 Filed under: 管理評論 - 作者: VinsonHsieh 發表留言報酬遞減/報酬遞增
- 在市場中領先的產品或公司,最終都會遇到極限,因此產品價格與市場佔有率會達到一種可以預瀾的平衡狀態
- 由大宗原料的生產轉變為科技的設計與運用。由資源加工變成資訊加工,由應用能源變成應用理念
-
報酬遞增是一種趨勢,讓領先者繼續領先,而落後者更加落後。報酬遞增所衍生的不是平衡狀態,而是不穩定性
- 報酬遞增不只讓產品變成業界標準,而且讓企業以不同的方式營運。在所有的產業中,報酬遞增與報酬遞減的機制是同時存在。但是大體而言,報酬遞減在傳統的經濟型態(加工業)中居於主導地位。而在較新的經濟型態(即以知識為基礎的產業)中,則是報酬遞增躍居主流
兩個商業世界
- 大量生產貨物與將知識打造成商品的世界
- 在大規模加工的產業中,通常最後會出現一套標準價格。因此競爭意謂著保持商品流通、嘗試改良品質、降低成本。它偏好沒有驚奇或意外狀況的環境。環境的特徵是控制與計畫。偏好老闆和員工的階層組織
- 以知識為基礎的產業,贏家幾近通吃的市場裡競爭,那麼管理必須重新定義為:尋找下一個技術贏家,「下一個暢銷產品」。管理不再是生產導向而是任務導向;階層扁平化不是因為民主制度突然施恩於勞工階層,而是因為電腦可以削減許多中間管理階層,員工必須像突擊隊一樣分成小組,直接向執行長或董事會報告。這些人需要充份授權,公司未來能否存活端賴他們。所以這些人,以及他們的「突擊隊」成員,不能被視為僱員,而要被視為讓公司成功的企業夥伴
報酬遞增競爭風格更像賭博
- 可以把高科技業的要角想像成在大賭場裡勾心鬥角的賭客。這張桌上的遊戲是多媒體,而另一張桌上的遊戲是網路服務業,角落裡的是電子銀行;這樣的賭桌不勝枚舉,你挑一張坐下來,問說要賭多少?莊家回答:三十億 · 有誰要下場?要等他們現身才會知道。規則是什麼?賭局揭曉時自然明白。賭贏的機率有多少?很難說。你還想玩嗎?
- 以這種方式來競爭的高科技業,不適合膽小溫馴的人。事實上,在科技賭場爭勝負的訣竅主要是心理因素。至於技術專業、雄厚的資本、意志力與勇氣,也有某種程度的重要性
最重要的是,在新遊戲從科技迷霧中現身時,最先瞭解其意義、看清其形態的賭客,才能夠滿載而歸
經理人的省思
- 馬歇爾的世界特色在計畫控制與階層組織;它是個物資、加工及最適化的世界。報酬遞增的世界其特徵在於觀察、定位、任務、團隊與精明;是個心理、認知與調適的世界
- 一、我了解市場的回饋方式嗎?
- 二、我是在哪個生態系中?
- 三、我有資源可以賭嗎,得有幾種條件?
- 四、接下來的賭局是什麼?