剑指offer题解汇总
https://blog.csdn.net/guliguliguliguli/article/details/126089434
本题链接
https://www.nowcoder.com/exam/oj/ta?difficulty=2&page=1&pageSize=50&search=&tpId=13&type=265
题目
小测试
@Test
public void test() {
for (int i = 0; i < 8; i++) {
System.out.println(240 & (1 << i));
}
}
输出:
0
0
0
0
16
32
64
128
本题答案
import java.util.*;
public class Solution {
public int NumberOf1(int n) {
int cnt = 0;
int temp = 1;
for (int i = 0; i < 32; i++) {
if ((n & temp) != 0) {
cnt++;
}
temp = temp << 1;
}
return cnt;
}
}
import java.util.*;
public class Solution {
public int NumberOf1(int n) {
int cnt = 0;
for (int i = 0; i < 32; i++) {
if ((n & (1 << i)) != 0) {
cnt++;
}
}
return cnt;
}
}
原码、反码、补码
计算机中有符号数有三种表示方法:原码、反码、补码
这三种表示方法均有符号位和数值位,符号位:0:正数,1:负数
在计算机系统中,数值一律用补码来表示和存储,原因在于:使用补码可以将符号位和数值域统一处理
模:一个计量系统的计数范围
例如:时钟的计量范围是0 ~ 11,模为12;表示n位的计算机的计量范围是0 ~ 2 n − 1 2^{n}-1 2n−1,模为 2 n 2^{n} 2n
模,实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器均可化减法为加法运算。
原码求补码
正数:正整数的补码是其二进制表示,与原码相同
负数:将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变),后加1
如果是8位表示:-15
原码:1000 1111
取反:1111 0000
加一:1111 0001
-15的补码:1111 0001
补码求原码
对该补码再求一次补码
反码
正数:正数的反码与原码相同
负数:负数的反码,符号位为1,数值部分按位取反