在哪里学习"位"?

pho*_*cao 5 c c++ architecture bit-manipulation bit

我试图找到一些书或资源详细讨论比特,以便例如我能够将数字(如16)转换成比特.我目前是一名高中生,每当阅读编程书籍时,我几乎可以理解除了位/位运算符部分之外的所有内容.我只是不知道它是如何工作的,为什么人们甚至发明了bit&byte :(.因此,我希望你们能给我一些资源建议,谈论如何将数字/字符翻译成位.

感谢您回答我的问题并度过美好的一天!

Pet*_*son 8

尝试谷歌搜索'二进制算术'.这是一篇非常好的文章,可以帮助您入门.


Ran*_*dom 5

您的问题与编码或任何特定的编程语言无关,但更多的是数学,特别是代数和数字系统.然后下一阶段将是处理器x86架构的基础知识,而不是你可以去编程语言.

顺便说一句:通常有关x86病毒的书籍是了解CPU工作方式的良好开端,但如果没有理解base-2和base-16系统,你就不会从中获得太多.


Jos*_*phH 5

http://en.wikiversity.org/wiki/Bitwise_operators

http://en.wikipedia.org/wiki/Binary_numbers

一旦你学会了如何用基数2(二进制或"位")表示数字,按位运算符很容易理解.

我只举一些简单的例子:

设m = 31532 = 111101100101100,n = 12325 = 11000000100101.

那么n&m(按位AND - 二元运算符)的结果是:

(如果n(i)和m(i)都是1,那么结果是1,0否则)

111101100101100
011000000100101
===============
011000000100100
Run Code Online (Sandbox Code Playgroud)

n |的结果 m(按位OR - 二元运算符)是:

(如果n(i)和m(i)为0,则结果为0,否则为1)

111101100101100
011000000100101
===============
111101100101101
Run Code Online (Sandbox Code Playgroud)

n ^ m(按位eXclusive OR - 二元运算符)的结果是:

(如果n(i)和m(i)是1,但不是两个,那么结果是1,0否则)

111101100101100
011000000100101
===============
100101100001001
Run Code Online (Sandbox Code Playgroud)

~n(按位非一元运算符)的结果是:

(如果n(i)= 1则结果为0,否则为1)

111101100101100
===============
000010011010011
Run Code Online (Sandbox Code Playgroud)

令k = 3,n >> k(按位右移)的结果为:

111101100101100
===============
000111101100101
Run Code Online (Sandbox Code Playgroud)

他们只是向右转k = 3次.这有效地将数字除以2 ^ k = 8.它通常被编译器用作优化.

相反,令k = 3,n << k(按位左移)的结果为

111101100101100
===============
101100101100000
Run Code Online (Sandbox Code Playgroud)

他们只是向左转k = 3次.这有效地将数字乘以2 ^ k = 8.这里要注意的一件事是因为32位整数只能容纳2 ^ 32-1,所以有一个算术溢出,即较高的k位被切断.

你必须仔细看看这些并找出这些模式.

它们在编程中很重要,因为它们通常用于设置/清除标志值.

因为int32有32个二进制数字,所以它最多可以包含32种不同的布尔标志(0表示false,或1表示true)

我认为这是关于它的.它们非常直观.