iT邦幫忙

0

轉換絕對值實際細節

  • 分享至 

  • xImage

剛剛在自己實作正負數轉換為絕對值的function

func main() {
	v := abs(-126)
	log.Println(v)
}

func abs(x int) int {
	con := x >> 63

	return (x ^ con) - con
}

我有自己寫成二進制用手算過,這個流程我懂
但問題有兩個

  1. 負數是因為IEEE754,sign(1,1)XOR=0,所以被轉換成正數的嗎?
  2. 正數右移的值是0,負數右移的值是-1,是因為最後除不盡所以用正負數能夠表示的最小/最大值表示?

請各路大神賜教...

看更多先前的討論...收起先前的討論...
https://hackmd.io/@sysprog/c-bitwise
上面是另外有人寫了,我就懶得說明了.
你何不用簡單的數字 1, 2, -1, -2, 0 用 bits 表示, 推演一下.
whitefloor iT邦研究生 2 級 ‧ 2021-08-13 20:19:08 檢舉
感謝大大
這個我有印出來過,但是中間的過程看不到
還有去google找答案,但是都一樣只有講結果
想要確定我想的是不是對的
真的很感謝你
我個人覺得鑽研這些看似厲害的問題,
也許這些年,很多各種面試聖經,刷題,看似很火熱.
但是真要做些有用的處理時,這種片段的"知識",怎樣派上用場,才是比較重要的.
另外 IEEE754 是浮點數標準,這是整數. 使用2的補數方式.
https://zh.wikipedia.org/wiki/%E4%BA%8C%E8%A3%9C%E6%95%B8
whitefloor iT邦研究生 2 級 ‧ 2021-08-14 13:14:36 檢舉
原來...是這樣
把以前的數學都還老師了==
感恩大大
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-08-13 22:11:12

https://ithelp.ithome.com.tw/upload/images/20210813/20001787FbllmMJCn2.png

package main

import (
	"fmt"
	"strconv"
)

func main() {
	v := abs(-126)
	fmt.Print(v)
}

func abs(x int) int {
	x64 := int64(x)
	con := x >> 63
	con64 := int64(con)
	fmt.Println("x = ", strconv.FormatInt(x64, 2), "(", x, ")")
	fmt.Println("con = ", strconv.FormatInt(con64, 2), "(", con, ")")
	fmt.Printf("x ^ con = %s ^ %s = %d\n", strconv.FormatInt(con64, 2), strconv.FormatInt(x64, 2), (x ^ con))
	fmt.Printf("(x ^ con) - con = %d - %d = %d\n", (x ^ con), con, (x ^ con) - con)
	return (x ^ con) - con
}
whitefloor iT邦研究生 2 級 ‧ 2021-08-14 13:17:58 檢舉

感恩大大

我要發表回答

立即登入回答