[討論] byte轉int問題

看板C_and_CPP作者 (how)時間11年前 (2013/04/17 23:37), 編輯推噓3(308)
留言11則, 6人參與, 最新討論串1/1
在Big-Endian的情況下 byte b[4]; int a=0; 第一種做法是用加的 a = (b[0]<<24 & 0xff000000) + (b[1]<<16 & 0x00ff0000)+ (b[2]<<8 & 0x0000ff00) + b[3]; 跟第二種做法用or operator a = (b[0]<<24 & 0xff000000) | (b[1]<<16 & 0x00ff0000) | (b[2]<<8 & 0x0000ff00) | (b[3] & 0x000000ff); 這兩種做法哪種比較好呢? 比較好的原因是? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.171.13.165

04/18 00:09, , 1F
cast不行嗎?
04/18 00:09, 1F

04/18 00:11, , 2F
cast應該最快可是可能有alignment的問題
04/18 00:11, 2F

04/18 00:13, , 3F
至於這兩種我覺得都一樣
04/18 00:13, 3F

04/18 00:27, , 4F
覺得一樣
04/18 00:27, 4F

04/18 09:18, , 5F
請問機器是那一種? x86 ? 加法與或運算都是一個時脈
04/18 09:18, 5F

04/18 09:22, , 6F
另外 不能用cast是因為原發問者說要轉為大端
04/18 09:22, 6F

04/18 09:22, , 7F
但x86,arm等極常用機器都是小端 用cast會反過來
04/18 09:22, 7F

04/18 09:24, , 8F
那個遮罩運算可以不用了 直接(int)(b[0])<<24+..就可以了
04/18 09:24, 8F

04/18 09:55, , 9F
& 可以不用, 但是用加號的時候括號不能省, 用 bitwise or
04/18 09:55, 9F

04/18 09:55, , 10F
可以不加括號
04/18 09:55, 10F

04/20 09:21, , 11F
a = htonl((*((int*)byte)))
04/20 09:21, 11F
文章代碼(AID): #1HRi714W (C_and_CPP)