求计算负整数二进制位的各种方法

ameyume
博客专家认证
2010-06-12 02:01:07
如题。
负数的二进制表示是绝对值取反加1.
可以先把十进制的绝对值转化为16进制数,然后再每位10进制转化为4位二进制位,再取反,最后末位加1即为对应的二进制数。
例如:-10
1.绝对值为10,对应16进制为A,则二进制位0000 0000 0000 1010
2.二进制取反为1111 1111 1111 0101
3.末位加1为 1111 1111 1111 0110, 即为-10的二进制表示。

那么,还有其他快速的方面吗?
怎么才能快速的计算出一个负数的二进制数?尤其是当一个数比较大时,比如unsigned short数54321,转化为short,则是一个负数。
...全文
1199 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
xixiaoliu 2010-06-12
  • 打赏
  • 举报
回复
接以上

作为 unsigned short 的 54321 的二进制表示是 1101 0100 0011 0001
所以其对应的 signed short 值 -11215 的二进制表示也是 1101 0100 0011 0001

因为“作为 unsigned short 的 54321”加上 11215 等于 65536,溢出后为 0
而“作为 signed short 的 -11215”加上 11215 也等于 0

所以两者是完全一样

====
再利用lz的规则解释,算54321的是负的多少的时候,用了一次“取反加一”,算出正的11215的二进制表示后又使用了一次“取反加一”,其实可以一次也不必使用。忘记取反加一。


xixiaoliu 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 ameyume 的回复:]
那么,还有其他快速的方面吗?
怎么才能快速的计算出一个负数的二进制数?尤其是当一个数比较大时,比如unsigned short数54321,转化为short,则是一个负数。
[/Quote]

signed 和 unsigned 只在你心中,不取决于外部。
比如unsigned short数54321,转化为short,则是一个负数。这个负数的二进制表示,和作为 unsigned short 的 54321 的二进制表示是一样的。所以,只要算作为“正数”的54321 的二进制表示
saishow 2010-06-12
  • 打赏
  • 举报
回复
需要标记一下.学到后面发现数学很重要了...
0x1000 2010-06-12
  • 打赏
  • 举报
回复
读内存中的位,一个一个读,读sizeof(int)* 8次就OK了,位运算要能熟练使用
xiaoqiao_82 2010-06-12
  • 打赏
  • 举报
回复
最快就是将绝对值转化为二进制,按位取反再加1啊……
还能怎么个快法?
eTouX 2010-06-12
  • 打赏
  • 举报
回复
还可以从全“1”的二进制码减绝对值大小
gz_qmc 2010-06-12
  • 打赏
  • 举报
回复
楼主好想想知道的是这个对应表吧
char
0-------------------------------------------255
0----------------127 -128------------------ -1
short
0-------------------------------------------65535
0---------------32767 -32768---------------- -1

如果手工算

知道-20000,那么他对应的无符号数就是65536-20000=45536
然后由45566来算16进制和二进制就简单多了

或者你直接算20000的16进制,然后前面缺的都用FF补满就是了
gz_qmc 2010-06-12
  • 打赏
  • 举报
回复
楼主好想想知道的是这个对应表吧
char
0-------------------------------------------255
0----------------127 -128------------------ -1
short
0-------------------------------------------65535
0---------------32767 -32768---------------- -1
selooloo 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 ameyume 的回复:]
引用 17 楼 selooloo 的回复:
想快速算的话,需要熟记几个二进制数,2^4=16,2^8=256,2^12=4096,2^16=65536...


计算负数的二进制的,用上面比它大的数减去它的绝对值,前面补1就可以
比如-10,就用16-10=6;
6的二进制是 0110
前面补1就是-10, 1111 1111 1111 0110

54321, 用65536-5……
[/Quote]
就是-11215
负数补码+负数绝对值原码=2^16(short 型)
只是这里54321充当了 负数补码,因为第16位是1;负数绝对值原码=65536-54321=11215
这时的11215是该负数的绝对值,所以54321的short值是 -11215
东莞某某某 2010-06-12
  • 打赏
  • 举报
回复
SHORT_MIN + (SHORT_MAX - un_short)
ameyume 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 selooloo 的回复:]
想快速算的话,需要熟记几个二进制数,2^4=16,2^8=256,2^12=4096,2^16=65536...


计算负数的二进制的,用上面比它大的数减去它的绝对值,前面补1就可以
比如-10,就用16-10=6;
6的二进制是 0110
前面补1就是-10, 1111 1111 1111 0110

54321, 用65536-54321=11215;
1215的二进制是 ……
[/Quote]
多谢。
另外,如果一个unsigned short值54321,用short输出的话,怎么快速计算出是负的多少?
selooloo 2010-06-12
  • 打赏
  • 举报
回复
想快速算的话,需要熟记几个二进制数,2^4=16,2^8=256,2^12=4096,2^16=65536...


计算负数的二进制的,用上面比它大的数减去它的绝对值,前面补1就可以
比如-10,就用16-10=6;
6的二进制是 0110
前面补1就是-10, 1111 1111 1111 0110

54321, 用65536-54321=11215;
1215的二进制是 0010 1011 1100 1111

前面补1就是-54321, 1111 0010 1011 1100 1111 (对于short型,这个就溢出了)

东莞某某某 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ameyume 的回复:]

多谢各位。
我就是想知道一种快速手工计算的方法,比如在笔试中,不会让你用计算机,计算器来算的,就用笔快速的解答。
[/Quote]
哪有这样的笔试
huanmie_09 2010-06-12
  • 打赏
  • 举报
回复
2010-06-12
  • 打赏
  • 举报
回复
用 0 减掉绝对值即可。

例:八位二进制下 -5 表示
5 = (101)2
100000000
- 00000101
= 11111011
cattycat 2010-06-12
  • 打赏
  • 举报
回复
笔试中那就按这种方法算吧,我以前的计算机原理课上老师给了一种方法,给忘了。
ameyume 2010-06-12
  • 打赏
  • 举报
回复
多谢各位。
我就是想知道一种快速手工计算的方法,比如在笔试中,不会让你用计算机,计算器来算的,就用笔快速的解答。
xiaolinxianju 2010-06-12
  • 打赏
  • 举报
回复
建议楼主看看谭浩强的书
gz_qmc 2010-06-12
  • 打赏
  • 举报
回复
unsigned short 的范围:0~65535
short 的范围:-32768~32767

如果你要表示-54321 就需要升级1位

unsigned short再升级就是unsigned int了

如果仅仅是算 10的负数
那么只有两种方案:
short a=10;
a*=-1;
或者
short a=10;
a=a^255+1
向立天 2010-06-12
  • 打赏
  • 举报
回复
-10在计算机里不直接就是0xFFF6
加载更多回复(8)

70,011

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧