我想在Clojure中使用按位函数(bit-shift-right
,bit-and
等),其中操作数是无符号的16位整数。
16位整数是从0到65535的十进制数,或者是从0000 0000 0000 0000到1111 1111 1111 1111的二进制数。
例如,这里123是java.lang.Long,因此会产生错误的答案:
(bit-not 123)
如何使123成为无符号16位整数,以便上面产生正确答案,即十进制65412?
所以0000 0000 0111 1011(123)应该变成1111 1111 1000 0100(65412)。
答案 0 :(得分:4)
Java(和Clojure)没有无符号整数类型。 Clojure主要只提供32位有符号整数位操作(def upload_budget_pdfs(request, project_id):
project = Project.objects.get(id=project_id)
print("Value of project in 'upload_budget_pdfs()': ", project)
if request.method == 'POST':
presentations = project.budget_versions.select_related('meeting').prefetch_related('budget_items', 'cci_items', 'presenters').filter(version_number__isnull=False).annotate(vn=F('version_number') * -1).order_by('presentation_date', 'created', '-vn')
print("Value of presentations in 'upload_budget_pdfs()': ", presentations)
drawing_formset = DrawingUploadFormset(request.POST, request.FILES, prefix="drawings", queryset=Drawing.objects.filter(budget__in=presentations).order_by('budget__presentation_date', 'budget__created'))
if drawing_formset:
print "Before", [b.id for b in project.budget_versions.all()]
try:
for drawing_form in drawing_formset: #ERF(24/01/2017 @ 1610) This line is what's causing the MultiValueDictKeyError
print 'drawing for loop entered in upload_budget_pdfs() - line 1034 '
if drawing_form.instance.budget:
print 'if statement entered - line 1036 '
print 'Instance: ', drawing_form.instance.budget
drawing = drawing_form.save(commit=False)
drawing.budget = drawing_form.instance.budget
drawing.save()
print drawing, [b.id for b in project.budget_versions.all()]
except Exception as e:
print '%s (%s)' % (e.message, type(e))
else:
print("Drawing formset not valid. ", drawing_formset.errors)
budget_formset = BudgetPresentationFormset(request.POST, request.FILES, instance=project, prefix="presentations")
if budget_formset:
try:
# Add a boolean so that budget is only added to form once
budgetSaved = False
for budget_form in budget_formset:
if budget_form:
if budgetSaved == False:
print 'if statement entered - line 1081 '
budget = budget_form.save(commit=False)
budget.save()
budgetSaved = True
except Exception as e:
print '%s (%s)' % (e.message, type(e))
else:
print("Budget formset not valid. ", budget_formset.errors)
return HttpResponseRedirect(reverse('projects:concept', args=[project_id]))
除外,相当于Java中的unsigned-bit-shift-right
。)
Java 8对通过Integer和Long类上的新方法将16位整数视为无符号整数的支持有限,它可以执行一些无符号运算(比较,乘法,除法,余数)。请参阅:http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
有一些外部库在Java中提供此功能,如https://github.com/jOOQ/jOOU。
答案 1 :(得分:2)
这有效:
(->> 123
bit-not
(bit-and 16rFFFF))
;65412
您可以将其缩短为:
(->> 123
(bit-and-not 16rFFFF))
;65412
我们正在使用long
作为无符号int
的代理。无论您使用哪种语言,JVM都没有未签名的int
或long
s。