「WTF系列」深入Java中的位操作

「WTF系列」深入Java中的位操作

學完本章節(jié)你將學會位的基礎(chǔ)概念與語法揣非,并且還會一些騷操作!躲因!

  • 與早敬、或忌傻、非、位移
  • 原碼搞监、反碼水孩、補碼
  • 字節(jié)、位琐驴、超區(qū)間......

開始本章節(jié)之前俘种,我們先思考一個問題:

byte a = 33;
byte b = -3;

若我們輸出a、b的二進制字符串是多少绝淡?

答案是這樣的么宙刘?

a->// 00100001
b->// 10100001

當然同學們可能會覺得我既然問了就肯定不是這樣;是吧~別著急你們試試就知道了牢酵。

在Java中輸出一個值對應(yīng)的二進制方法有很多悬包,這里提供一個簡單的方法:

int value = 33;
String bs = String.format("%32s", Integer.toBinaryString(value)).replace(" ", "0");

在方法中是int值,int占4字節(jié)32位馍乙,所以是:“%32s” 若是byte將32改成8即可布近;當然對于byte你還需要加上“&0xFF”來做高位清零操作。

String bs = String.format("%8s", Integer.toBinaryString(value&0xFF)).replace(" ", "0");

基本原則

在Java中是采用的有符號的運算方式丝格,故:高位為符號位撑瞧,其余位存儲數(shù)據(jù)信息显蝌。

簡單來說:

+1 ->// 00000001
-1 ->// 10000001

默認例子中的值都按byte來算预伺,占8位,減少大家的記憶負擔琅束。

因為byte占8位扭屁,所以有效數(shù)據(jù)存儲7位,最高位為符號位涩禀。int值則是31位存儲數(shù)據(jù)料滥。

  • 0 代表正數(shù)
  • 1 代表負數(shù)

上述的-1的表示方法其實并不是機器碼,而是人腦的理解方式艾船。

我們認為+1與-1的差異就是高位不同而已葵腹,這是我們基于自然規(guī)律來看的;而機器真正存儲的值其實是:11111111屿岂;這里其實就給大家提到了最初的問題践宴。

二進制的計算規(guī)則是:逢2進1

這個很好理解,因為表示的數(shù)字就是:0爷怀、1兩個數(shù)字阻肩,想要表示更大的值就只能往前遞增進步。

在平時生活中是逢10進1;因為咱們有10個數(shù)字:9烤惊、8乔煞、7、6柒室、5渡贾、4、3雄右、2空骚、1、0擂仍;所以11就是:當為0|9增加為10的時候就進一格所以變成:1|0囤屹,個位再把剩余的1補上就是:1|1;所以就是11逢渔。

那么:

1就是:0|0|0|0|0|0|0|1 
2就是:0|0|0|0|0|0|1|0 
3就是:0|0|0|0|0|0|1|1
4就是:0|0|0|0|0|1|0|0  

運算法則

image-20181229100325309

設(shè)

byte a = (byte) 0b01011000;  // 88
byte b = (byte) 0b10101000;  // -88
int n = 1;

按位與 a & b

image-20181227113852053

輸入2個參數(shù)

a牺丙、b對應(yīng)位都為1時,c對應(yīng)位為1复局;反之為0。

**按位或 a | b****

image-20181227113946327

輸入2個參數(shù)

a粟判、b對應(yīng)位只要有一個為1亿昏,c對應(yīng)位就為1;反之為0档礁。

按位異或 a^b

image-20181227114005969

輸入2個參數(shù)

a角钩、b對應(yīng)位只要不同,則c對應(yīng)位就為1呻澜;反之為0递礼。

按位取反(非)

image-20181227115107965

輸入1個參數(shù)

c對應(yīng)位與輸入?yún)?shù)a完全相反;a對應(yīng)位為1羹幸,則c對應(yīng)位就為0脊髓;a對應(yīng)位為0,則c對應(yīng)位就為1栅受。

左移

image-20181227115525706

輸入1個參數(shù)a将硝;n = 1

a對應(yīng)位全部左移動n位得到c;a最左邊的n個位全部丟棄(紅色框)屏镊,c最右邊n個位補充0(綠色框)依疼。

右移(帶符號)

image-20181227150135326

輸入1個參數(shù)b;n = 1

這里將參數(shù)換為b是因為b為負數(shù)而芥,第一個位為1

b對應(yīng)位全部右移動n位得到c律罢;b最右邊n個位全部丟掉(紅色框),c最左邊n個位補充1(綠色框)棍丐。

這里需要注意的是其左邊補充的值取決于b的最高位也就是符號位符號位是1則補充1误辑,符號位是0則補充0沧踏。

右移(無符號)

image-20181227151319711

輸入1個參數(shù)b;n = 1

這里將參數(shù)換為b是因為b為負數(shù)稀余,第一個位為1

b對應(yīng)位全部右移動n位得到c悦冀;b最右邊n個位全部丟掉(紅色框),c最左邊n個位補充0(綠色框)睛琳。

這里需要注意的是其左邊補充的值永遠為0盒蟆,不管其最高位(符號位)的值。

進制表示規(guī)范

這個小節(jié)是插曲师骗,部分同學可能注意到上面寫的進制定義是:0b01011000历等,部分同學 可能疑惑為什么不是 0x 之類的。

前綴

  • 十進制:直接寫數(shù)字即可
  • 二進制:0b或0B開頭辟癌;如:0b01011000 代表十進制 88
  • 八進制:0 開頭寒屯;如:0130 代表十進制 88 (1x64+3x8)
  • 十六進制:0x或0X開頭;如:0x58 代表 88 (5x16+8)

后綴

  • 0x?? 若小于127 則按byte算黍少,大于則按int類型算
  • 0xFF默認為int類型
  • 若聲明為long添加后綴:L或l:如:0xFFL 或 0xFFl
  • 帶小數(shù)的值默認為double類型寡夹;如:0.1
  • 若聲明為float添加后綴:f 或 F:如:0.1F
  • 若聲明為double添加后綴:d或D:如:1D

范圍

  • 二進制:1、0
  • 八進制:0~7
  • 十進制:0~9
  • 十六進制:0~9 + A~F

類型轉(zhuǎn)換

在上述運算法則中:兩個不同長度的數(shù)據(jù)進行位運算時厂置,系統(tǒng)會將二者按右端對齊左端補齊菩掏,然后進行位運算

設(shè)

  • a 為 int 占32位
  • b 為 byte 占8位

執(zhí)行: a&b 昵济、a|b 智绸、a^b….等操作時:

  1. 若b為正數(shù),則左邊補齊24個0
  2. 若b為負數(shù)访忿,則左邊補齊24個1

若b = 0b01011000 補齊后:0b 00000000 00000000 00000000 01011000

若b = (byte) 0b10101000 補齊后:0b 11111111 11111111 11111111 10101000

為什么 b = 0b10101000 需要加上 (byte) 強轉(zhuǎn)瞧栗?

因為默認的0b10101000會被理解為:0b 00000000 00000000 00000000 10101000,這個值是一個超byte范圍的int值(正數(shù)):168海铆。

當強轉(zhuǎn) byte 后高位丟棄迹恐,保留低8位,對于byte來說低8中的高位就是符號位卧斟;所以運算后就是:-88(byte)系草。

原碼、反碼唆涝、補碼

相信看了上面那么多的各種規(guī)定后找都,大家有一定的疑問,為什么正數(shù)與負數(shù)與大家所想的不大一樣呢廊酣?

我相信大家覺得正數(shù)負數(shù)就是這樣的:

// 錯誤的理解
// 0b01011000 -> 88  : (64+16+8)
// 0b11011000 -> -88 : -(64+16+8)

大家可能會想能耻,正數(shù)與負數(shù)不就應(yīng)該只是差符號位的變化么?

// 正確的理解
// 0b01011000 -> 88  : (64+16+8)
// 0b10101000 -> -88 : -(64+16+8)

0b10101000 : -(64+16+8) ?晓猛?WTF饿幅?? 除了符號位能懂以外請你告訴我是怎么得出 64戒职、16栗恩、8的?

在這里我們先設(shè)兩個基本的概念:

  • 原碼:人所能直接理解的編碼
  • 機器碼:計算機能直接理解的編碼

允許我先說一個小故事:對于在坐的各位來說計算1-1是非常簡單的洪燥,但是對于計算機來說就是計算:00000001 與 10000001 (暫且按8位磕秤,原碼)。

image-20181227162239126

計算機需要識別出橙色部分的符號位捧韵,然后提取出粉色部分的數(shù)據(jù)進行計算市咆;這里有兩個問題:

  1. 識別橙色符號位是困難的
  2. 若橙色部分是負數(shù)則需要增加減法計算模塊

但對于計算機來說做加法就夠了,將1-1換算為:1+(-1)再来;OK這一步就是將所有的減法都換算為加法進行計算蒙兰,減少了減法硬件模塊的設(shè)計,提升了計算機的硬件利用率芒篷。

但是這里就有一個問題了搜变,既然是將-1當作了一個值來進行運算,那么必然這個值需要方便做加法才行针炉;按上圖來說我們必不可免的需要去做一次符號位的判斷痹雅,然后再做數(shù)據(jù)位的減法操作,簡單來說還是在做減法糊识。

所以若計算機的機器碼直接采用原碼則會導致硬件資源的設(shè)計問題。

有沒有一種辦法將符號位直接存儲到整個結(jié)構(gòu)中摔蓝,讓計算機在計算過程中不去管所謂的符號位與數(shù)據(jù)位赂苗?有的!就是反碼贮尉。

反碼

  • 正數(shù)的反碼是其本身
  • 負數(shù)的反碼是在其原碼的基礎(chǔ)上, 符號位不變拌滋,其余各個位取反〔卵瑁可以簡單理解為 "~a | 10000000"
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
image-20181227163556584

如上圖败砂,咱們將 -1 的原碼轉(zhuǎn)化為了反碼;此時我們使用 反[+1] + 反[-1] 進行一次運算:

image-20181227164122945

此時咱們可以得到一個值x魏铅,這個值可以確定的是符號位為1昌犹,為負數(shù),后面數(shù)據(jù)位全部為1览芳;因為此時是反碼狀態(tài)斜姥,所以要想我們能直接讀取數(shù)據(jù)是不是應(yīng)該轉(zhuǎn)化為原碼狀態(tài)啊。

// 反碼轉(zhuǎn)原碼流程就是倒過來,符號位不變铸敏,其余位為取反即可缚忧。
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原= [00000001]反 + [11111110]反 = [11111111]反 = [10000000]原 = -0

可以看出我們已經(jīng)解決好了運算的問題了,計算機只需要按照反碼的方式去計算即可杈笔,只需要做加法闪水,不需要做減法就可以運算減法流程。計算完成后對于人腦來說需要將反碼轉(zhuǎn)化為原碼就是可讀的數(shù)據(jù)了蒙具。

但上述也暴露一個問題:-0 的問題球榆;對于0的表示將會出現(xiàn)兩種情況:

  • [11111111]反 = [10000000]原 = -0
  • [01111111]反 = [00000000]原 = +0

也就是出現(xiàn)兩種為0的表示值恰梢,-0與+0翔怎;但對于我們來說0就是0列另,不需要做區(qū)分棵介。所以又引入了補碼力试。

補碼

  • 正數(shù)與反碼規(guī)則一樣無需變化:補碼=反碼=原碼
  • 負數(shù)在反碼基礎(chǔ)上保證符號位不變奠旺,從右端+1
[+1] = [00000001]原 = [00000001]反 = [00000001]補
[-1] = [10000001]原 = [11111110]反 = [11111111]補
image-20181227170001363

此時若計算機使用補碼直接進行計算會怎樣鹉究?

image-20181227170750910

當我們使用補碼計算時复旬,因為末尾的兩位均為1旱爆,1+1 = 2舀射;對于二進制來說滿2進1,所以往前進位1怀伦,進位后又遇到 1+1 = 2的情形脆烟,所以依次進位,當前位置0房待。

最終計算后就是:1 00000000 邢羔,一共9位,因為當前只有8位桑孩,所以自然就只剩下:00000000 拜鹤。

請注意:在當前運算過程中符號位并無差別也直接當作普通值進行步進運算!

如此我們就完成了整個流程的運算流椒,但你還需注意的是敏簿,當前運算后的值是補碼,也就是機器直接操作的編碼宣虾;如果要還原為我們可讀的值需要反向轉(zhuǎn)化為原碼惯裕。由最初定義可知,正數(shù):原碼=補碼绣硝;上述補碼為正數(shù)蜻势,所以原碼也是:00000000。整個流程如下:

// 補碼計算流程
1 - 1 = 1 + (-1) 
= [00000001]原 + [10000001]原 
= [00000001]反 + [11111110]反 
= [00000001]補 + [11111111]補
= [00000000]補
= [00000000]原
= 0

補碼->原碼

正數(shù)的補碼就是原碼

負數(shù):

  1. 直接倒敘流程鹉胖,保證符號位不變右端減1咙边,再保證符號位不變其余位取反即可
  2. 再走一遍補碼流程猜煮;補碼的補碼就是原碼(先取反再+1即可)【敲黑板】

思考[10000000]代表什么?

若是某個計算完成后的補碼值為:10000000 那么他對應(yīng)的值是什么呢败许?

// 按方案1來看:
[10000000]補 = [11111111]反 = [10000000]原
// 按方案2來看:
[10000000]補 = [11111111]補反 = [10000000]補補 = [10000000]原
可見方案1王带、方案2都是一樣的,補碼的補碼就是原碼市殷。

[10000000]原 = 是等于0呢愕撰?還是-0呢?還是-128呢醋寝?

因為我們已經(jīng)規(guī)定了:[00000000]原 = 0搞挣;為了充分利用位的存儲區(qū)間,所以將:[10000000]原 = -128

一般情況下不會對[10000000]補碼求原碼音羞,因為也沒啥意義~

思考(127囱桨、-127)原碼、反碼嗅绰、補碼是多少舍肠?

對于正數(shù):

127 = [01111111]原 = [01111111]反 = [01111111]補

對于負數(shù):

-127 = [11111111]原 = [10000000]反 = [10000001]補

對于計算機來說,其存儲的值都是補碼窘面,所以也就造成了一開始我們提到的問題:為什么88與-88的二進制并不只是符號位不同翠语?

再次強調(diào):計算機存儲的是補碼,為了方便運算财边;我們想要理解其表示的值需要轉(zhuǎn)化為原碼肌括。

溢出問題

因為計算機計算過程中不再區(qū)別符號位,直接將符號位也納入運算流程中酣难;所以也就可以解釋2個基礎(chǔ)問題:(溢出)

  1. 兩個正數(shù)相加為負數(shù)
  2. 兩個負數(shù)相加為正數(shù)

大家可以分析一下:

  1. 88+100
  2. (-66) + (-88)

上述計算在byte變量范圍下進行計算谍夭,嘗試分析一下補碼的計算流程。

存儲區(qū)間

默認的對于采用補碼的計算機系統(tǒng)而言憨募,其存儲值的有效范圍是:-2^(n-1) ~ 2^(n-1) -1 紧索;n代表當前的位數(shù)。

  • byte馋嗜,1字節(jié),8位:-2^7 ~ 2^7 -1 = -128~127
  • short吵瞻,2字節(jié)葛菇,16位:-2^15 ~ 2^15 -1 = -32768 ~ 32767
  • int,4字節(jié)橡羞,32位:2^31 ~ 2^31 -1
  • ......

若眯停,我想在byte中存儲超過127的值會怎樣?

設(shè)

  • int i = 200
  • 對應(yīng)補碼為: 0000 0000 0000 0000 0000 0000 1100 1000
  • 因200未超256(2^8)所以依然只會使用到8個位
int i = 200; // 0000 0000 0000 0000 0000 0000 1100 1000 (200)
byte b = (byte) 200; // 1100 1000

當我們將200強轉(zhuǎn)為byte時高位丟棄僅剩下低8位:1100 1000

如果我們對byte進行輸出會怎樣卿泽?

System.out.println(b); // "-56"

首先其直接調(diào)用的是:public void println(int x) 方法莺债,OK滋觉,既然是int輸出為啥不是200?而是-56齐邦?

就算有這樣的方法:public void println(byte x) 方法椎侠,會輸出200么?也不會4肽础我纪!

首先對于byte b來說:1100 1000 這是一個負數(shù)的補碼,其原碼流程是:

[1100 1000]補 = [1011 0111] = [1011 1000]原 = -(32+16+8) = -56

這里有一個有趣的事情丐吓,int轉(zhuǎn)byte時是直接丟掉高位的所有數(shù)據(jù):24個0浅悉;但byte轉(zhuǎn)int時,補充高24位時是根據(jù)當前的符號位來補充的券犁,若當前符號位是1則添1术健,若符號位是0則添0;對于byte來說第一位就是符號位粘衬,當前的1100 1000符號位是“1”所以添加的就是24位1荞估。

int c = b; // b -> 1100 1000
// c -> 1111 1111 1111 1111 1111 1111 1100 1000

若直接打印的是byte值,就是-56色难;上面我們分析1100 1000的原碼時就已經(jīng)證明了泼舱。那么打印c是不是呢?

對于范圍較少的類型轉(zhuǎn)換位大類型時不會丟失數(shù)據(jù)枷莉,原來是什么就是什么娇昙。

OK,就算不是上面那句話笤妙,我們來看看:

[1111 1111 1111 1111 1111 1111 1100 1000]補
= [1000 0000 0000 0000 0000 0000 0011 0111]
= [1000 0000 0000 0000 0000 0000 0011 1000]原
= -(32+16+8) = -56

若我們轉(zhuǎn)換為int時想要還原最初的200這個值該如何辦冒掌?

分析上面的補碼,可以看出其與最初的補碼差異僅僅在于左邊24位的不同:

[1111 1111 1111 1111 1111 1111 1100 1000]補 = -56
[0000 0000 0000 0000 0000 0000 1100 1000]補 = 200

那么我們只需要將前面的24位重置為0即可蹲盘,這里就有一個與操作的簡單用法:

/**
 *
 * 1111 1111 1111 1111 1111 1111 1100 1000 (the int)
 * &
 * 0000 0000 0000 0000 0000 0000 1111 1111 (the 0xFF)
 * =======================================
 * 0000 0000 0000 0000 0000 0000 1100 1000 (200)
 */
System.out.println(b & 0xFF); // "200"

在這里我們做了一次特殊的:b & 0xFF 操作股毫,b 轉(zhuǎn)換為int之后的值與 0xFF 進行按位與操作。

0xFF = 255 其int原碼為:0000 0000 0000 0000 0000 0000 1111 1111召衔,恰好最后8位為1铃诬,其余24位為0;所以可以用來做高位擦除操作苍凛。

這樣的用法可用以存儲超范圍的數(shù)據(jù)趣席,比如對于文件的大小來說永遠都是 >= 0,不可能會使用到 < 0 的值醇蝴,所以對于原始的我們可以根據(jù)這個宣肚,使用較少的byte表示更多的區(qū)間,簡單來說就是無符號悠栓。將符號位也用以存儲數(shù)據(jù)霉涨。

int i = 0xFF60; // 65376
System.out.println(i);
// 00000000000000001111111101100000
System.out.println(String.format("%32s", Integer.toBinaryString(i)).replace(" ", "0"));

byte b1 = (byte) i; 
byte b2 = (byte) (i >> 8); 
// 01100000
System.out.println(String.format("%8s", Integer.toBinaryString(b1 & 0xFF)).replace(" ", "0"));
// 11111111
System.out.println(String.format("%8s", Integer.toBinaryString(b2 & 0xFF)).replace(" ", "0"));

int ret = (b1 & 0xFF) | (b2 & 0xFF) << 8;
System.out.println(String.format("%32s", Integer.toBinaryString(ret)).replace(" ", "0"));
// 65376
System.out.println(ret);

若沒有做 & 0xFF 操作按价,其值應(yīng)是:

/*
 * 0000 0000 0000 0000 0000 0000 0110 0000 (b1)
 * |
 * 1111 1111 1111 1111 1111 1111 0000 0000 (b2<<8)
 * =======================================
 * 1111 1111 1111 1111 1111 1111 0110 0000 (-160)
 */
System.out.println(b1 | b2 << 8); // "-160"

65376 本質(zhì)來說超過了short的存儲范圍:-32768~32767 ,但其在int中依然只需占2個字節(jié)16位:65376<65536笙瑟。所以我們只需要使用2個byte即可存儲楼镐,而不需要int的4個byte來存儲。

在Socket傳輸中使用這樣的方式能有效降低傳輸?shù)淖止?jié)冗余逮走。

案例-多Flag存儲在一個byte中

有這樣一個情形:一個四邊形鸠蚪,四條邊可以是虛線也可以是實線,四條邊相互獨立师溅;定義為 a\b\c\d 四邊茅信;此時我們需要在畫布上畫出這個四邊形;但是因為4邊相互獨立墓臭,所以我們常見的就是定義4個bool值:

boolean a = true;
boolean b = false;
boolean c = false;
boolean d = true;

void changeA(boolean fullLine) {
    a = fullLine;
}

簡單來說我們定義這樣的方式其一比較麻煩蘸鲸,其二總占用的內(nèi)存空間至少是4個byte,也有可能是16byte(按int存的情況)窿锉。

但是我們表示的內(nèi)容無非就是2種:實線酌摇、虛線

所以我們可以這樣做:

static byte a = 0b00000001;
static byte b = 0b00000010;
static byte c = 0b00000100;
static byte d = 0b00001000;

byte x = 0b00000000;

定義a、b嗡载、c窑多、d為static,并且使用最后的4位即可洼滚。

若我們想要改變a邊的實虛:

void changeA(boolean fullLine) {
    if (fullLine) {
        x = (byte) (x | a);
    } else {
        x = (byte) (x & ~a);
    }
}

通過該方法埂息,若a邊為實線,則將a flag的值填入x中遥巴,反之擦除掉x中的a邊信息千康;同時保證其他信息不變。

若要拿铲掐,也就是判斷a是否為實線該如何辦拾弃?

boolean isFullLine() {
    // return (x & a) != 0;
    return (x & a) == a;
}

2種寫法都是OK的,不過需要注意若對應(yīng)的a使用了符號位則需要使用0xFF先清理自動補充的符號位摆霉。因為與豪椿、或、非等操作默認會將參數(shù)轉(zhuǎn)化為int類型進行携栋;所以會出現(xiàn)自動補充符號位的情況搭盾。

這樣的操作方案在Android或Socket傳輸中都是非常常見的,比如Socket NIO中的SelectorKey中的ops變量就是這樣的機制刻两;這能有效減少存儲多個參數(shù)的情況增蹭;并且位操作并不會帶來多少計算負擔滴某。

以上就是關(guān)于Java 位操作的常見疑問與原理的講解磅摹,其實還有一些深入的東西滋迈,比如:同余、負數(shù)取模户誓、小數(shù)饼灿、規(guī)律運算等;這些因為使用較少并且篇幅有限就等下期再給大家一一介紹了帝美。

我是QIUJUER碍彭,關(guān)于我

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市悼潭,隨后出現(xiàn)的幾起案子庇忌,更是在濱河造成了極大的恐慌,老刑警劉巖舰褪,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異占拍,居然都是意外死亡略就,警方通過查閱死者的電腦和手機表牢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人等龙,你說我怎么就攤上這事琅翻∩阌” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵疮薇,是天一觀的道長胸墙。 經(jīng)常有香客問我,道長按咒,這世上最難降的妖魔是什么迟隅? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮励七,結(jié)果婚禮上智袭,老公的妹妹穿的比我還像新娘。我一直安慰自己掠抬,他們只是感情好吼野,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著两波,像睡著了一般瞳步。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腰奋,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天单起,我揣著相機與錄音,去河邊找鬼劣坊。 笑死嘀倒,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播测蘑,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绕沈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帮寻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤赠摇,失蹤者是張志新(化名)和其女友劉穎固逗,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體藕帜,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡烫罩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了洽故。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贝攒。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖时甚,靈堂內(nèi)的尸體忽然破棺而出隘弊,到底是詐尸還是另有隱情,我是刑警寧澤荒适,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布梨熙,位于F島的核電站,受9級特大地震影響咽扇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陕壹,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一质欲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糠馆,春花似錦嘶伟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赠橙,卻和暖如春耽装,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背期揪。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工掉奄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓姓建,卻偏偏與公主長得像诞仓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子速兔,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容