- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
根据我读到的关于 the binary representation of integers 的内容,第一位是符号(正或负)。
假设我们有一个整数 x = 5
和 sys.getsizeof(x)
返回 28
(即 28 位的二进制表示)。
现在我正在尝试将第一位翻转为 1
通过使用 x|=(1<<27)
但它返回 134217733
.
我只是想知道它是否需要是一些负数? (不是-5)
我这样做有什么问题吗?
最佳答案
您不能像您尝试的那样将 Python int
从正面切换到负面,只需在其表示中稍微翻转一下即可。您假设它存储在固定长度的二进制补码表示中。但是 Python 3 中的整数不是固定长度的位串,它们也不是以二进制补码表示形式存储的。相反,它们存储为 30 位或 15 位“数字”的可变长度字符串,符号单独存储(如 signed-magnitude representation )。因此,否定 Python int
的“最低级别”方法不是使用位操作,而是使用一元 -
运算符,它将切换其符号。 (有关 Python 3 源代码的详细信息,请参阅此答案的末尾。)
(我还应该提到 sys.getsizeof()
不会告诉您 int
中的位数。它会告诉您整数占用的内存字节数对象正在使用。这也不是实际存储数的字节数;这些字节中的大部分用于其他事情。)
您仍然可以在 Python 中使用二进制补码表示,方法是使用正 int
模拟固定长度的位串。首先,选择您想要的长度,例如 6 位。 (您可以轻松地选择更大的数字,例如 28 或 594。)我们可以定义一些有用的常量和函数:
BIT_LEN = 6
NUM_INTS = 1 << BIT_LEN # 0b1000000
BIT_MASK = NUM_INTS - 1 # 0b111111
HIGH_BIT = 1 << (BIT_LEN - 1) # 0b100000
def to2c(num):
"""Returns the two's complement representation for a signed integer."""
return num & BIT_MASK
def from2c(bits):
"""Returns the signed integer for a two's complement representation."""
bits &= BIT_MASK
if bits & HIGH_BIT:
return bits - NUM_INTS
现在我们可以像您一样做一些事情:
>>> x = to2c(2)
>>> x |= 1 << 5
>>> bin(x)
'0b100010'
>>> from2c(x)
-30
这表明在 6 位二进制补码表示中打开数字 2 的高位会将数字变为 -30。这是有道理的,因为 26-1 = 32,所以这个表示中的最小整数是 -32。并且 -32 + 2 = -30。
如果您对 Python 3 如何存储整数的细节感兴趣,可以查看 Objects/longobject.c在源代码中。特别是看 the function _PyLong_Negate()
:
/* If a freshly-allocated int is already shared, it must
be a small integer, so negating it must go to PyLong_FromLong */
Py_LOCAL_INLINE(void)
_PyLong_Negate(PyLongObject **x_p)
{
PyLongObject *x;
x = (PyLongObject *)*x_p;
if (Py_REFCNT(x) == 1) {
Py_SIZE(x) = -Py_SIZE(x);
return;
}
*x_p = (PyLongObject *)PyLong_FromLong(-MEDIUM_VALUE(x));
Py_DECREF(x);
}
您可以看到它在正常情况下所做的只是取反整数对象的 Py_SIZE()
值。 Py_SIZE()
只是对整数对象的 ob_size
字段的引用。当此值为0时,整数为0。否则,其符号为整数的符号,其绝对值为保存整数绝对值的数组中30位或15位数字的个数。
关于python - 在 python 中的二进制运算中否定整数的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37135106/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!